转:fetionsdk群组

//这里声明一个飞信群类(可能包括多个群),其中sdk为FetionSDK类的一个实例

NullStudio.Fetion_SDK.Group.GroupBase group = new NullStudio.Fetion_SDK.Group.GroupBase(sdk);

//得到所有的群列表

List<PersonalGroup> perGrp = group.getPersonalGroupList();

//下面两个代码至关重要,没有的话就无法加载群成员列表(这是我用.NET Reflector努力研究的成果)

AsyncBizOperation op = new AsyncBizOperation(perGrp[0]);
sdk.AccountManager.CurrentUser.PersonalGroupManager.GetGroupMemberList(perGrp[0], op);

//显示perGrp[0]群中的成员

//注意:上面二行代码的执行需要一些时间,如果接着就是以下代码,可能得到的msg的值为空;

//可以增加事件perGrp[0].MemberLoadStatusChanged

//在事件调用函数里调用以下代码

string msg = string.Empty;

lock (perGrp[0].Members.SyncObject)
{
       foreach (PersonalGroupMember member in perGrp[0].Members)
       {
               msg += member.DisplayName + "/n";
       }
}
MessageBox.Show(msg);

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lxiongh/archive/2009/09/09/4536873.aspx

 

 

FetionSDK.dll 说明                                 BY SYSU_LXIONGH
前言 :

       这篇文章是基于 Fetionsdk.dll 飞信端程序开发而写的 , 里面的代码是我通过 Reflector 反编译中国移动开发的飞信 2008 中的 fetionFx.exe 研究的结果 .Fetionsdk.dll 的下载地址 :

http://sites.google.com/site/allwealthshare/software/FetionSDK.dll.rar?attredirects=0

       移动的飞信客户端是用 C# 语言开发的 , 所以我们在利用 fetionsdk.dll 来开发自己的飞信客户端的时候也应采用 C# 语言来开发 ( 我不清楚能不能用其他语言来开发 , 如 C++). 有一点需要说明的是 , 这个 fetionsdk.dll 是位能人反编绎而来的 , 难免会有些 bug. 例如 : 如果好友没有在分组里 , 则无法向其发送短信 , 也无法加载他的信息 ( 解决方法 : 用移动的飞信登录后将其加入分组里 ).

(The way to contact: SYSU_短号:611449,QQ:464050924)


 

能实现的功能 :

1.       登录飞信 , 注销飞信 , 设置飞信登录状态 .

2.       加载好友列表 .

3.       得到好友列表的分组 .

4.       加载飞信群成员列表 .

5.       加载飞信好友图像 (Portrait).

6.       加载任意飞信号图像 (Portrait).

7.       发送即时信息 , 发送手机短信 .

8.       接收飞信好友信息 .

9.       添加飞信好友 .

(there will be more...)

If you get some funtions different and you can realize it.

I will be very happy if you can share with me through the

QQ,Email or other contact way.


 

具体实现 :

       在引用里加入下面几个命名空间的引用 :

       Using NullStudio.Fetion_SDK;

       Using Imps.Core;

       ( 当然还可能有其他的命名空间 , 这里就不一一写出 )

       几个重要的事件 ( 这些应该在全局作用域内 )

       sdk.SDK_ReceiveMessage += new FetionSDK.SDK_ReceiveMessageEventHandler(sdk_SDK_ReceiveMessage);

      sdk.SDK_UserSatusChange += new FetionSDK.SDK_UserSatusChangedEventHandler(sdk_SDK_UserSatusChange);

         sdk.SDK_Error += new FetionSDK.SDK_ErrorEventHandler(sdk_SDK_Error);

       声明一个全局范围内的变量 : Fetionsdk sdk ( 这是一个飞信控制的总类 , 作用于整个程序 )

 

功能 1( 登录飞信 , 注销飞信 , 设置飞信登录状态 ) :

       //Fill 手机号及密码 .

       sdk.AccountManager.FillUserIdandPassword(string id,string password,bool autoLoginOrout)

 

       // 自动判断是登录还是注销

       sdk.AccountManager.LoginOrout();

 

         // 设置飞信登录状态 , 这里设置为在线

( 前提 : 飞信已经登录 , 可以在飞信登录状态为 Logon 时调用此方法 )

sdk.AccountManager.CurrentUser.Presence.AsyncChangeMainPresence(Imps.Common.MainPresence.Online,Imps.Common.MainPresence.Online.ToString()); 

      

功能 2( 加载好友列表 ):

sdk.ContactControl.getAllContactList(); // 返回一个类型为 contact 的列表 List<Imps.Core.contact>

 

功能 3( 加载好友分组 ):

       List<ContactGroup> cotactGroups = sdk.ContactControl.getContactGroup();

         // 可以在 contactGroup 中加载属于该组的好友列表

         List<Contact> contacts = contactGroup.Contacts.ListContacts.

 

功能 4( 加载群成员列表 ):

       GroupBase groupBase = new GroupBase(sdk);

       List<PersonalGroup> personalGroups = groupBase.getPersonalGroupList();

         // 下面的代码很重要 , 如若缺少 , 则 personalGroups 里只是一些基本信息 , 成员信息没有 .

     foreach (PersonalGroup personalGroup in personalGroups)

     {

         AsyncBizOperation op = new AsyncBizOperation();

         lock (op)

         {

             sdk.AccountManager.CurrentUser.PersonalGroupManager.GetGroupMemberList(group, op);

         }

       }

 

功能 5,6( 加载图像 ):

首先要得到一个有效的 Contact 实例

其次增加 Contact.ContactInfo. PropertiesChanged 事件

最后在事件代码里完成图片的下载

基本代码如下 :

IicUri uri = Uri.CreatUri(string MobileNo);

Contact contact   = sdk.AccountManager.CurrentUser.ContactList.FindFindContactByMsisdnEx(uri.MobileNo);

If(contact==null)

{

           AsyncBizOperation op = new AsyncBizOperation();

           contact = sdk.AccountManager.CurrentUser.ContactList.FindOrCreateContact(uri.Raw, op);

}

// 添加事件

contact.PersonalInfo.PropertiesChanged += new EventHandler<PropertiesChangedEventArgs>(PersonalInfo_PropertiesChanged);

void PersonalInfo_PropertiesChanged(object sender, PropertiesChangedEventArgs e)

{

                 // 返回为 True 时表示图像下载完毕

if (!e.ContainsAnyOfProperties(new string[] { "nickname", "Provision", "Portrait" }))

        {

pictureBox1.Image = ((ContactInfo)sender).Portrait; 

}

}

 

功能 7( 发送消息 )

sdk.ContactControl.SendSMS.SendSMS(friendPhone, msg);   // 发送手机短信

sdk.ContactControl.SendIM.SendIM(friendPhone, msg);     // 进行即时通信

( 注 : 通过 contact.Presence.MainPresence 在属性值确定用户状态 , 如 :

Imps.Common.MainPresence.OfflineLogin,

Imps.Common.MainPresence.Offline);

 

功能 8 ( 接收好友信息 )

       接收信息前需要添加事件 sdk.SDK_ReceiveMessage

         然后在事件中接收消息

 

功能 9( 添加飞信好友 )

       // 声明变量

bool isByMobileNo = false;        // 是否以手机号码加飞信

string id = string.Empty;              //userId

string domain = string.Empty;           // 域

Nullable<int> targetGroupId = null;        // 添加到哪一组中 ( 每个 contactGroup 能有一个 ID 属性 )

string localName = string.Empty;            // 本地备注

ContactList.AddBuddyExtraData extraData = new ContactList.AddBuddyExtraData();

bool sendRequestAgain = false;

bool copyWhenExist = false;

Nullable<bool> invite = null;

AsyncBizOperation op = new AsyncBizOperation();

        

         // 赋值

IicUri uri = IicUri.CreateTelUri(friendNo);

id = uri.MobileNo;

isByMobileNo = true;

domain = "fetion";

targetGroupId = targetId;

localName = “// 本地备注名 ”

extraData = new ContactList.AddBuddyExtraData();

extraData.WhoAmI = “// 我是谁 ?”

sendRequestAgain = true;

copyWhenExist = false;

invite = null;

 

// 执行加入好友

op.ImpsError += new EventHandler<ImpsErrorEventArgs>(op_ImpsError);

op.Successed += new EventHandler(op_Successed);

sdk.AccountManager.CurrentUser.ContactList.AsyncAddBuddy(isByMobileNo, id, domain, targetGroupId, localName, extraData, sendRequestAgain, copyWhenExist, invite, op);


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lxiongh/archive/2009/09/23/4584642.aspx

 

2009-07-22 00:17

飞信因为原来就用C#做的,因此可以反编译研究到很多部分。

从开发机器人角度最简单的入门就是FETIONSDK这个去年有人公开的项目,在GOOGLE的CODE网站可以找到。但是由于它是实现了飞信DLL的接口。因此存在不少BUG。比如好友上线状态通知取不到等等。

在这种情况下其实可以将新版飞信的DLL拷贝到原项目,编译,看到几个没有实现的接口,然后自己在项目中实现就可以了。理论上可以跟随飞信的版本升级而升级。

现阶段在飞信机器人项目中可利用的事件如下:

            sdk.SDK_ReceiveMessage += sdk_SDK_ReceiveMessage;
            sdk.SDK_UserSatusChange += sdk_SDK_UserSatusChange;
            sdk.SDK_Error += sdk_SDK_Error;
            sdk.AccountManager.CurrentUser.ContactList.ContactsChanged += new EventHandler<ContactsChangedEventArgs>(ContactList_ContactsChanged);
            sdk.AccountManager.CurrentUser.ContactList.AddBuddyRequest += new EventHandler<AddBuddyApplicationEventArgs>(ContactList_AddBuddyRequest);
            sdk.AccountManager.CurrentUser.ContactList.ContactTypeChanged += new EventHandler<ContactTypeChangedEventArgs>(ContactList_ContactTypeChanged);
           

其他一些方法暂时没有被触发或没有被用到(主动邀请好友),都被偶注释鸟:

            //sdk.AccountManager.CurrentUser.ContactList.AddMobileBuddyReply += new EventHandler(ContactList_AddMobileBuddyReply);
            //sdk.AccountManager.CurrentUser.ContactList.AddBuddyResult += new EventHandler<AddBuddyResultEventArgs>(ContactList_AddBuddyResult);
            //sdk.AccountManager.CurrentUser.PersonalGroupManager.InviteJoinGroup += new EventHandler<InviteJoinGroupEventArgs>(PersonalGroupManager_InviteJoinGroup);
            //sdk.AccountManager.CurrentUser.ContactList.Changed += new EventHandler<ContactListEventArgs>(ContactList_Changed);
          

        能看到以上内容的人不要问偶要代码,自己尝试实现接口的方法很容易的。内容留空即可。

        另外飞信机器人是可以发文件的,有兴趣的人可以研究ConversationManager.SendFile方法。反编译FETIONFX.exe可以找到官方实现的代码(在ConversationWindows.cs)文件的 SendFile方法。代码如下:


        private void SendFile(bool toMobile, string filePath)
        {
            try
            {
                if (!EnvHelper.DynamicGifCtlRegistered)
                {
                    base.UnifiedMessageBox.ShowInfo(this, "您现在没法发送共享文件,请与系统管理员联系!");
                }
                else
                {
                    if ((this.CurrentConversation == null) || (this.CurrentConversation.CurrentDialog == null))
                    {
                        this.initConversation();
                    }
                    this.CheckConversaiton();
                    if (((this.CurrentConversation.CurrentDialog.ShareContents.Count == 0) && this.CurrentConversation.CurrentDialog.IsMultiConversation) && (this.CurrentConversation.CurrentDialog.Participants.Count == 1))
                    {
                        Imps.Client.Core.Contact contact = this.CurrentConversation.CurrentDialog.Participants[0].Contact;
                        this.CurrentConversation.Close();
                        Thread.Sleep(50);
                        this.CurrentConversation = base.CurrentUser.ConversationManager.OpenConversation(contact);
                        this.SendFile(toMobile, filePath);
                    }
                    else if (this.checkBeforeUpload())
                    {
                        UploadShareContent item = this.CreateUploadShareContent(toMobile, filePath);
                        if ((item != null) && this.checkBeforeUpload())
                        {
                            AsyncBizOperation operation = new AsyncBizOperation();
                            item.BizOperation = operation;
                            operation.ImpsError += new EventHandler<ImpsErrorEventArgs>(this.op_ImpsError);
                            this.CurrentConversation.CurrentDialog.ShareContents.Add(item, true);
                            item.SendFile();
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                ClientLogger.WriteGeneral("发送文件失败", exception.ToString());
            }
        }

根据这个思路修改自己飞信SDK里的相关部分即可。

 

加载飞信好友的图像 Portrait ( 它属于 Contact.ContactInfo.Portrait)

首先要得到一个有效的 Contact 实例

其次增加 Contact.ContactInfo. PropertiesChanged 事件

最后在事件代码里完成图片的下载

基本代码如下 :

IicUri uri = Uri.CreatUri(string MobileNo);

Contact contact = sdk.AccountManager.CurrentUser.ContactList.FindFindContactByMsisdnEx(uri.MobileNo);

If(contact==null)

{

         AsyncBizOperation op = new AsyncBizOperation();

         contact = sdk.AccountManager.CurrentUser.ContactList.FindOrCreateContact(uri.Raw, op);

}

// 添加事件

contact.PersonalInfo.PropertiesChanged += new EventHandler<PropertiesChangedEventArgs>(PersonalInfo_PropertiesChanged);

 

void PersonalInfo_PropertiesChanged(object sender, PropertiesChangedEventArgs e)

{

         // 这里应该是一个循环 , 等返回为 True 时才表示图像下载完毕

while (!e.ContainsAnyOfProperties(new string[] { "nickname", "Provision", "Portrait" }))

     {}

pictureBox1.Image = ((ContactInfo)sender).Portrait; 

}

 

//最近几天发了有关基于FetionSDK.dll飞信开发的一些代码,都是比较凌乱,没有有机的组织在一起,但这

 

//都是一些基本的模块,若以后有时间我会将所有的代码组织一下,再发到博客上,敬请关注!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lxiongh/archive/2009/09/15/4556614.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值