一些朋友经常问相关飞信WebService接口的调用问题,经过整理,我把调用所有功能都集成到一个类中,大家直接创建引用这个控件类就可以实现飞信接口的所有功能了。
此类使用.NET2.0环境开发,大家可以把这个类编译成DLL文件,然后在别的.NET语言引用或在.NET3.0引用
些类调用实例源码下载地址:
http://download.csdn.net/source/2008359
下载后使用VS2005打开就可以直接编译运行了。
下面是这个类的源代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Win32;
using FetionObj.fWebSer;
namespace Fetion
{
/// <summary>
/// 飞信账户信息结构
/// </summary>
public struct FUser
{
/// <summary>
/// 飞信账号
/// </summary>
public string FNo;
/// <summary>
/// 飞信手机号
/// </summary>
public string MNo;
/// <summary>
/// 用户姓名或昵称
/// </summary>
public string UName;
/// <summary>
/// 飞信在线
/// </summary>
public bool isIM;
/// <summary>
/// 短信在线
/// </summary>
public bool isSMS;
/// <summary>
/// 是否活动
/// </summary>
public bool isInvite;
/// <summary>
/// 好友分组组名
/// </summary>
public string GroupName;
}
/// <summary>
/// 飞信WebService接口应用类
/// 注:使用此类先引用http://io2.139icq.com:88/fWebSer.asmx?WSDL
/// 对于购买了后台接口软件用户请根据自己的本地接口地址重新引用一次
/// 本地接口地址类拟如:http://192.168.1.8/fWebSer.asmx?WSDL
/// </summary>
public class FetionObj
{
private bool login = false;
private string _myMNo = "", _MyFetionNo = "", _MyMobileNo = "", _MyName="";
private object _obj = null;
private fWebSer fws; //引用http://io2.139icq.com:88/fWebSer.asmx?WSDL产生的类
/// <summary>
/// 有新短信时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ReU">发送方用户信息</param>
/// <param name="Msg">收到的信息内容</param>
public delegate void ReFindMsg(FetionObj FObj, FUser ReU, string Msg); //接收到短信
/// <summary>
/// 有新短信时触发事件
/// </summary>
public event ReFindMsg OnReFindMsg; //接收到短信
/// <summary>
/// 接收短信出错时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ErrTxt">错误信息</param>
public delegate void ReErr(FetionObj FObj, string ErrTxt); //收信息错误
/// <summary>
/// 接收信息出错时触发事件
/// </summary>
public event ReErr OnReErr;
/// <summary>
/// 被添加为好友时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ReU">对方用户信息</param>
/// <returns>true同意,并添加他为好友,false不同意</returns>
public delegate bool ReAdd(FetionObj FObj, FUser ReU);
/// <summary>
/// 被添加为好友时触发事件
/// </summary>
public event ReAdd OnReAdd;
/// <summary>
/// 好友状态改变时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ReU">好友对方信息</param>
public delegate void PChanged(FetionObj FObj, FUser ReU);
/// <summary>
/// 好友状态改变时触发事件
/// </summary>
public event PChanged OnPChanged;
/// <summary>
/// 好友打开聊天窗口时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ReU">好友对方信息</param>
public delegate void OpChatWin(FetionObj FObj, FUser ReU);
/// <summary>
/// 好友打开聊天窗口时触发事件
/// </summary>
public event OpChatWin OnOpChatWin;
/// <summary>
/// 每发送成功一条短信时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ToFNo">目标飞信号</param>
/// <param name="Msg">发送的信息内容</param>
public delegate void SendOk(FetionObj FObj, string ToFNo, string Msg); //每成功发一条
/// <summary>
/// 每发送成功一条短信时触发事件
/// </summary>
public event SendOk OnSendOk; //每成功发一条
/// <summary>
/// 全部发送完成后触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
public delegate void SendAllOk(FetionObj FObj); //发送全部完后
/// <summary>
/// 每发送出错时时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="ToFNo">目标飞信号</param>
/// <param name="Msg">发送的信息内容</param>
/// <param name="ErrTxt">错误信息</param>
public delegate void SendErr(FetionObj FObj, string ToFNo, string Msg, string ErrTxt); //发送出错
/// <summary>
/// 每发送出现错误时时触发事件
/// </summary>
public event SendErr OnSendErr; //发送出错
/// <summary>
/// 飞信登录结束后触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信运用类对象</param>
/// <param name="oklogin">登录是否成功,true为成功</param>
public delegate void Login(FetionObj FObj, bool oklogin);
/// <summary>
/// 飞信登录结束后触发事件
/// </summary>
public event Login OnLogin;
/// <summary>
/// 好友列表完成时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信类对象</param>
/// <param name="uList">好友列表</param>
public delegate void MList(FetionObj FObj, FUser[] uList);
/// <summary>
/// 好友列表完成时触发事件
/// </summary>
public event MList OnMList;
/// <summary>
/// 飞信被注销时触发事件代理
/// </summary>
/// <param name="FObj">发生事件的飞信类对象</param>
/// <param name="msg">提示相关信息</param>
public delegate void Logout(FetionObj FObj,string msg);
/// <summary>
/// 飞信被注销时触发事件
/// </summary>
public event Logout OnLogout;
/// <summary>
/// 飞信类构造函数
/// </summary>
public FetionObj()
{
fws = new fWebSer();
fws.CookieContainer = new System.Net.CookieContainer();
}
~FetionObj()
{
if (fws != null)
{
fws.Logout(_myMNo);
fws.Dispose();
}
}
/// <summary>
/// 给调用程序保存任何信息
/// 以方便在多线程中通信
/// </summary>
public object obj
{
get { return _obj; }
set { _obj = value; }
}
/// <summary>
/// 确定是否已经登录,等于true为已经登录
/// </summary>
public bool isLogin
{
get { return login; }
}
/// <summary>
/// 返回用于登录的手机号或飞信号
/// </summary>
public string GetMyNo
{
get { return _myMNo; }
}
/// <summary>
/// 返回自己的飞信号
/// </summary>
public string GetMyFetionNo
{
get { return _MyFetionNo; }
}
/// <summary>
/// 返回自己的手机号
/// </summary>
public string GetMyMobileNo
{
get { return _MyMobileNo; }
}
/// <summary>
/// 返回自己的昵称
/// </summary>
public string GetMyName
{
get { return _MyName; }
}
/// <summary>
/// 登录飞信
/// </summary>
/// <param name="myMNo">手机号或飞信号</param>
/// <param name="myMPass">飞信密码</param>
/// <returns>true操作成功(注:发生OnLogin事件后才知道登录是否成功),false操作失败</returns>
public bool LoginFetion(string myMNo, string myMPass)
{
try
{
_myMNo = myMNo;
login = false;
fws.Login(myMNo, myMPass);
if (!reAsync)
{
reAsync = true;
DelegateTreCom dn = new DelegateTreCom(TreCom); //实例化委托并初赋值
IAsyncResult iar = dn.BeginInvoke(_myMNo, new AsyncCallback(CallBackTreCom), dn); //异步开始执行
}
return true;
}
catch { return false; }
}
private bool reAsync=false; //连续接收信息开关
private delegate void DelegateTreCom(string recom);
private void TreCom(string myMNo)
{//用异步处理收到的信息
try
{
string remsg=fws.ReMsg(myMNo, 40);
string[] rearr = remsg.Split('/n');
for (int i = 0; i < rearr.Length; i++)
{
//分析记录
string com = "", rfno = "", rmno = "", msg = "", errtxt = "", rgno = "", fname = "";
string[] comarr = rearr[i].Split('&');
for (int j = 0; j < comarr.Length; j++)
{
string[] varr = comarr[j].Split('=');
if (varr.Length < 2) continue;
if (varr[0] == "com") com = varr[1];
if (varr[0] == "rfno") rfno = varr[1];
if (varr[0] == "rmno") rmno = varr[1];
if (varr[0] == "msg") msg = varr[1];
if (varr[0] == "errtxt") errtxt = varr[1];
if (varr[0] == "rgno") rgno = varr[1];
if (varr[0] == "fname") fname = varr[1];
}
if ("rmsg,sendok,senderr,loginok,loginerr,fadd,list,logout,changed".IndexOf(com)<0)
if (OnReErr != null) OnReErr(this, msg+errtxt);
if (com == "rmsg" && OnReFindMsg != null)
{//收到新信息
FUser fu = new FUser();
fu.FNo = rfno;
fu.MNo = rmno;
fu.UName = fname;
fu.isIM = true;
fu.isSMS = true;
fu.isInvite = true;
fu.GroupName = "";
OnReFindMsg(this, fu, msg);
}
if (com == "sendok" && OnSendOk != null)
{//发送成功
OnSendOk(this,rfno, msg);
}
if (com == "senderr" && OnSendErr != null)
{//发送失败
OnSendErr(this, rfno, msg,errtxt);
}
if (com == "loginok" && OnLogin != null)
{//登录成功
login = true;
_MyFetionNo = rfno;
_MyMobileNo = rmno;
_MyName = fname;
OnLogin(this, true);
}
if (com == "loginerr" && OnLogin != null)
{//登录失败
reAsync = false;
login = false;
OnLogin(this, false);
}
if (com == "fadd" && OnReAdd != null)
{//被添加为好友
string[] farr = msg.Trim().Split('|');
if (farr.Length >= 7)
{
FUser fu = new FUser();
fu.FNo = farr[0];
fu.MNo = farr[1];
fu.UName = farr[2];
fu.isIM = (farr[3] == "信息" ? true : false);
fu.isSMS = (farr[4] == "短信" ? true : false);
fu.isInvite = (farr[5] == "在线" || farr[5] == "聊天" ? true : false);
fu.GroupName = farr[6];
OnReAdd(this, fu);
}
}
if (com == "list" && OnMList != null)
{//好友列表完成
FUser[] fuarr = GetMList();
OnMList(this, fuarr);
}
if (com == "logout" && OnLogout != null)
{//被注销
reAsync = false;
login = false;
OnLogout(this,msg);
}
if (com == "changed")
{//好友状态改变
string[] farr = msg.Trim().Split('|');
if (farr.Length >= 7)
{
FUser fu = new FUser();
fu.FNo = farr[0];
fu.MNo = farr[1];
fu.UName = farr[2];
fu.isIM = (farr[3] == "信息" ? true : false);
fu.isSMS = (farr[4] == "短信" ? true : false);
fu.isInvite = (farr[5] == "在线" || farr[5] == "聊天" ? true : false);
fu.GroupName = farr[6];
if (farr[5] == "聊天")
{
if (OnOpChatWin != null) OnOpChatWin(this, fu); //打开聊天窗口
}
else
{
if (OnPChanged!=null) OnPChanged(this, fu);
}
}
}
}
}
catch (Exception er) {
if (OnReErr != null) OnReErr(this, er.Message+er.StackTrace);
}
if (reAsync)
{//重复调用接收数据
Thread.Sleep(2000); //控制调用速度
DelegateTreCom dn = new DelegateTreCom(TreCom); //实例化委托并初赋值
IAsyncResult iar = dn.BeginInvoke(myMNo, new AsyncCallback(CallBackTreCom), dn); //异步开始执行
}
}
//异步完成时,执行的方法(回调方法),此方法只能有IAsyncResult一个参数,但是该参数几乎万能,可以传递object
private void CallBackTreCom(IAsyncResult ar)
{
//从异步状态ar.AsyncState中,获取委托对象
DelegateTreCom dn = (DelegateTreCom)ar.AsyncState;
//一定要EndInvoke,否则下场很惨
dn.EndInvoke(ar);
}
/// <summary>
/// 注销飞信
/// </summary>
public void LogoutFetion()
{
reAsync = false;
fws.Logout(_myMNo);
}
/// <summary>
/// 发送短信(注:你可以多次调用,在SendOk事件返回成功结果)
/// </summary>
/// <param name="toMNoArr">发送目标手机号或飞信号数组</param>
/// <param name="SmsMsg">发送的信息内容</param>
public bool SendSms(string[] toMNoArr, string SmsMsg)
{//发送
try
{
List<string> toIm = new List<string>();
for (int i = 0; i < toMNoArr.Length; i++)
{
if (toMNoArr[i].Trim() == String.Empty) continue;
fws.Send(_myMNo, toMNoArr[i].Trim(), SmsMsg);
}
return true;
}
catch (Exception err)
{
if (OnSendErr != null) OnSendErr(this, "", SmsMsg, err.Message);
return false;
}
}
/// <summary>
/// 添加好友
/// </summary>
/// <param name="addMNo">要添加的目标手机号或飞信号</param>
/// <param name="Msg">给对方的信息,限制不大于10个字符(即5个汉字)</param>
/// <param name="FriendName">自定义的好友姓名或昵称</param>
public bool AddFriend(string addMNo, string Msg, string FriendName)
{//加好友
if (addMNo == String.Empty) return false;
try
{
fws.AddF(_myMNo, addMNo, Msg);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 删除好友
/// </summary>
/// <param name="addMNo">要删除的目标手机号或飞信号</param>
public bool DelFriend(string delMNo)
{
try
{
fws.DelF(_myMNo, delMNo);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 直接获取好友列表
/// </summary>
public FUser[] GetMList()
{
string fl=fws.FList(_myMNo);
string[] flarr = fl.Trim().Split('/n');
FUser[] FUArr = new FUser[flarr.Length];
for (int i = 0; i < flarr.Length; i++)
{
string[] farr = flarr[i].Split('|');
if (farr.Length < 6) continue;
FUArr[i].FNo = farr[0];
FUArr[i].MNo = farr[1];
FUArr[i].UName = farr[2];
FUArr[i].isIM = (farr[3] == "信息" ? true : false);
FUArr[i].isSMS = (farr[4] == "短信" ? true : false);
FUArr[i].isInvite = (farr[5] == "在线" || farr[5] == "聊天" ? true : false);
FUArr[i].GroupName = farr[6];
}
return FUArr;
}
}
}