백엔드 개발 C#.Net 튜토리얼 ASP.NET WeChat 공개 계정 고객 서비스 인터페이스

ASP.NET WeChat 공개 계정 고객 서비스 인터페이스

Dec 20, 2016 pm 01:43 PM
위챗 공개 계정

本文实例为大家分享了ASP.NET微信客服接口的具体代码,供大家参考,具体内容如下

Kf_account.cs代码:

public partial class Kf_account : Form
 {
  private readonly DataTable adt_user = new DataTable();
  private readonly string as_INIFile = Application.StartupPath + "\\user.ini";
 
  public Kf_account()
  {
   BindUser();
  }
 
  private void BindUser()
  {
   if (!File.Exists(as_INIFile))
   {
    var str = new StringBuilder();
    str.Append(";内容由程序自动生成,请不要修改此文件内容\r\n");
    str.Append("[total]\r\n");
    str.Append("total=\r\n");
    str.Append("[count]\r\n");
    str.Append("count=\r\n");
    str.Append("[user]\r\n");
    //StreamWriter sw = default(StreamWriter);
    //sw = File.CreateText(ls_INIFile);
    //sw.WriteLine(str.ToString());
    //sw.Close();
    File.WriteAllText(as_INIFile, str.ToString(), Encoding.Unicode);
    File.SetAttributes(as_INIFile, FileAttributes.Hidden);
   }
   CheckForIllegalCrossThreadCalls = false;
   InitializeComponent();
   Icon = Resource1.ico;
   lkl_num.Text = INIFile.ContentValue("total", "total", as_INIFile);
   lkl_num_c.Text = INIFile.ContentValue("count", "count", as_INIFile);
   pictureBox1.Visible = true;
   var sr = new StreamReader(as_INIFile, Encoding.Unicode);
   String line;
   int li_count = 0;
   adt_user.Columns.Clear();
   adt_user.Columns.Add("username", Type.GetType("System.String"));
   adt_user.Columns.Add("openid", Type.GetType("System.String"));
   while ((line = sr.ReadLine()) != null)
   {
    li_count++;
    if (li_count > 6)
    {
     line = SysVisitor.Current.GetFormatStr(line);
     DataRow newRow;
     newRow = adt_user.NewRow();
     newRow["username"] = line.Substring(0, line.LastIndexOf('='));
     newRow["openid"] = line.Substring(line.LastIndexOf('=') + 1);
     adt_user.Rows.Add(newRow);
    }
   }
   sr.Close();
   dataGridView1.AutoGenerateColumns = false;
   dataGridView1.DataSource = adt_user;
   //dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;
   lbl_count.Text = "共" + (li_count - 6) + "行";
   pictureBox1.Visible = false;
  }
 
  private void btn_GetUser_Click(object sender, EventArgs e)
  {
   if (MessageBox.Show(@"拉取用户信息的速度取决于你的关注数与网络速度,
可能需要几分钟甚至更长时间。
使用此功能将消耗大量用户管理接口配额。
要继续此操作吗?",
    "提示:", MessageBoxButtons.YesNo) == DialogResult.No)
   {
    return;
   }
   var thr = new Thread(Get_user_list);
   thr.Start();
  }
 
  private void Get_user_list()
  {
   File.Delete(as_INIFile);
   var str = new StringBuilder();
   str.Append(";内容由程序自动生成,请不要修改此文件内容\r\n");
   str.Append("[total]\r\n");
   str.Append("total=\r\n");
   str.Append("[count]\r\n");
   str.Append("count=\r\n");
   str.Append("[user]\r\n");
   File.WriteAllText(as_INIFile, str.ToString(), Encoding.Unicode);
   File.SetAttributes(as_INIFile, FileAttributes.Hidden);
 
   string ls_appid = INIFile.ContentValue("weixin", "Appid");
   string ls_secret = INIFile.ContentValue("weixin", "AppSecret");
   string access_token = "";
   string menu = "";
   if (ls_appid.Length != 18 || ls_secret.Length != 32)
   {
    MessageBox.Show("你的Appid或AppSecret不对,请检查后再操作");
    return;
   }
   access_token = SysVisitor.Current.Get_Access_token(ls_appid, ls_secret);
   if (access_token == "")
   {
    MessageBox.Show("Appid或AppSecret不对,请检查后再操作");
    return;
   }
   menu = SysVisitor.Current.GetPageInfo("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + access_token);
   if (menu.Substring(2, 7) == "errcode")
   {
    MessageBox.Show("拉取失败,返回消息:\r\n" + menu);
   }
 
   JObject json = JObject.Parse(menu);
   lkl_num.Text = json["total"].ToString();
   INIFile.SetINIString("total", "total", lkl_num.Text, as_INIFile);
   lkl_num_c.Text = json["count"].ToString();
   INIFile.SetINIString("count", "count", lkl_num_c.Text, as_INIFile);
   int li_count = int.Parse(json["count"].ToString());
   btn_GetUser.Enabled = false;
   pictureBox1.Visible = true;
   FileStream fs = null;
   Encoding encoder = Encoding.Unicode;
   for (int i = 0; i < li_count; i++)
   {
    string openid, username;
    openid = Get_UserName(json["data"]["openid"][i].ToString());
    username = json["data"]["openid"][i].ToString();
    //INIFile.SetINIString("user", openid, username, as_INIFile);
    byte[] bytes = encoder.GetBytes(openid + "=" + username + " \r\n");
    fs = File.OpenWrite(as_INIFile);
    //设定书写的開始位置为文件的末尾 
    fs.Position = fs.Length;
    //将待写入内容追加到文件末尾 
    fs.Write(bytes, 0, bytes.Length);
    fs.Close();
    lab_nums.Text = "已拉取" + i + "个,还剩" + (li_count - i) + "个,请耐心等待";
   }
   lab_nums.Text = "";
   //BindUser();
   btn_GetUser.Enabled = true;
   pictureBox1.Visible = false;
   MessageBox.Show("已全部拉取完毕,请重新打开该窗口");
  }
 
  /// <summary>
  ///  获取用户信息详情,返回json
  /// </summary>
  /// <param name="as_openid"></param>
  private string Get_User(string as_openid)
  {
   string ls_json = "";
   string access_token = "";
   access_token = SysVisitor.Current.Get_Access_token();
   ls_json =
    SysVisitor.Current.GetPageInfo("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + as_openid + "&lang=zh_CN");
   return ls_json;
  }
 
  /// <summary>
  ///  获取用户用户的昵称
  /// </summary>
  private string Get_UserName(string as_openid)
  {
   string ls_json = "";
   ls_json = Get_User(as_openid);
   string username = "";
   JObject json = JObject.Parse(ls_json);
   username = json["nickname"].ToString();
   username = SysVisitor.Current.GetFormatStr(username);
   return username;
  }
 
  private void btn_search_Click(object sender, EventArgs e)
  {
   string username = txt_search.Text.Trim();
   if (string.IsNullOrWhiteSpace(username))
   {
    return;
   }
   DataRow[] datarows = adt_user.Select("username like &#39;%" + username + "%&#39;");
 
   var ldt = new DataTable();
   ldt.Columns.Clear();
   ldt.Columns.Add("username", Type.GetType("System.String"));
   ldt.Columns.Add("openid", Type.GetType("System.String"));
   ldt = ToDataTable(datarows);
   try
   {
    lbl_count.Text = ldt.Rows.Count.ToString();
   }
   catch
   {
   }
   dataGridView1.AutoGenerateColumns = false;
   dataGridView1.DataSource = ldt;
  }
 
  public DataTable ToDataTable(DataRow[] rows)
  {
   if (rows == null || rows.Length == 0) return null;
   DataTable tmp = rows[0].Table.Clone(); // 复制DataRow的表结构 
   foreach (DataRow row in rows)
    tmp.Rows.Add(row.ItemArray); // 将DataRow添加到DataTable中 
   return tmp;
  }
 
  private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {
   try
   {
    SysVisitor.Current.Wx_openid =
     dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1].Value.ToString();
    SysVisitor.Current.Wx_username =
     dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[0].Value.ToString();
    //MessageBox.Show(str);
    grb_chat.Enabled = true;
    grb_chat.Text = SysVisitor.Current.Wx_username;
   }
   catch
   {
 
   }
   webBrowser_msg.DocumentText = "";
   string url = string.Format("https://api.weixin.qq.com/cgi-bin/customservice/getrecord?access_token={0}",
    SysVisitor.Current.Get_Access_token());
   string ls_text = @"{";
   ls_text += "\"starttime\" : " + DateTime.Now.AddDays(-3).Ticks + ",";
   ls_text += "\"endtime\" : " + DateTime.Now.Ticks + ",";
   ls_text += "\"openid\" : \"" + SysVisitor.Current.Wx_openid + "\",";
   ls_text += "\"pagesize\" : 1000,";
   ls_text += "\"pageindex\" : 1,";
   ls_text += "}";
   string ls_history = SysVisitor.Current.PostPage(url, ls_text);
   webBrowser_msg.DocumentText = ls_history;
  }
 
  private void btn_send_Click(object sender, EventArgs e)
  {
   string ls_msg = richTextBox_msg.Text;
   string ls_text = @"{";
   ls_text += "\"touser\":\"" + SysVisitor.Current.Wx_openid + "\",";
   ls_text += "\"msgtype\":\"text\",";
   ls_text += "\"text\":";
   ls_text += "{";
   ls_text += "\"content\":\"" + ls_msg + "\"";
   ls_text += "}";
   ls_text += "}";
   string url = string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}",
    SysVisitor.Current.Get_Access_token());
   string ls_isright = SysVisitor.Current.PostPage(url, ls_text);
 
   webBrowser_msg.DocumentText += "<P><FONT size=3>" + ls_isright + "</FONT></P>";
  }
 
  private void btn_addkf_Click(object sender, EventArgs e)
  {
   string url = string.Format("https://api.weixin.qq.com/customservice/kfaccount/add?access_token={0}", SysVisitor.Current.Get_Access_token());
   //客服账号 设置 xxx@你的公众号 这样的格式才是正确的哟。
   string ls_text = "{";
   ls_text += "\"kf_account\":test2@gz-sisosoft,";
   ls_text += "\"nickname\":\"客服2\",";
   ls_text += "\"password\":\"12345\",";
   ls_text += "}";
   string ls_kf = @"{
       &#39;kf_account&#39; : &#39;test1@gz-sisosoft&#39;,
       &#39;nickname&#39; : &#39;客服1&#39;,
       &#39;password&#39; : &#39;123456&#39;,
      }";
   string ls_isok = SysVisitor.Current.PostPage(url, ls_text);
   MessageBox.Show(ls_isok);
  }
 
  private void Kf_account_Load(object sender, EventArgs e)
  {
  }
 }
로그인 후 복사

SysVisitor.cs代码:

class SysVisitor
{
 private static SysVisitor visit = null;
 public static SysVisitor Current
 {
  get
  {
   if (visit == null)
    visit = new SysVisitor();
 
   return visit;
  }
 }
 /// <summary>
 /// 获取access_token
 /// </summary>
 /// <param name="appid">appid</param>
 /// <param name="secret">appsecret</param>
 /// <returns></returns>
 public string Get_Access_token(string appid, string appsecret)
 {
  string secondappid = INIFile.ContentValue("weixin", "secondappid");
  if (appid.ToLower() == secondappid.ToLower())
  {
   string ls_time = INIFile.ContentValue("weixin", "gettime");
   Decimal ldt;
   try
   {
    ldt = Convert.ToDecimal(ls_time);
    if (Convert.ToDecimal(DateTime.Now.ToString("yyyyMMddHHmmss")) - ldt < 7100)//每两个小时刷新一次
    {
     return INIFile.ContentValue("weixin", "access_token");
    }
   }
   catch
   { }
  }
  string ls_appid = appid.Replace(" ", "");
  string ls_secret = appsecret.Replace(" ", "");
  string access_token = "";
  string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", ls_appid, ls_secret);
  string json_access_token = GetPageInfo(url);
  //DataTable dt = Json.JsonToDataTable(json_access_token);
  DataTable dt = JsonHelper.JsonToDataTable(json_access_token);
  try
  {
   access_token = dt.Rows[0]["access_token"].ToString();
  }
  catch
  {
   return "";
  }
  INIFile.SetINIString("weixin", "gettime", DateTime.Now.ToString("yyyyMMddHHmmss"));
  INIFile.SetINIString("weixin", "access_token", access_token);
  INIFile.SetINIString("weixin", "secondappid", ls_appid);
 
  return access_token;
 }
 
 /// <summary>
 /// 获取access_token
 /// </summary>
 public string Get_Access_token()
 {
  string ls_appid = INIFile.ContentValue("weixin", "Appid");
  string ls_secret = INIFile.ContentValue("weixin", "AppSecret");
  return Get_Access_token(ls_appid, ls_secret);
 }
 
 /// <summary>
 /// Get方法请求url并接收返回消息
 /// </summary>
 /// <param name="strUrl">Url地址</param>
 /// <returns></returns>
 public string GetPageInfo(string url)
 {
  HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
  string ret = string.Empty;
  Stream s;
  string StrDate = "";
  string strValue = "";
 
  if (response.StatusCode == HttpStatusCode.OK)
  {
   s = response.GetResponseStream();
   ////在这儿处理返回的文本
   StreamReader Reader = new StreamReader(s, Encoding.UTF8);
 
   while ((StrDate = Reader.ReadLine()) != null)
   {
    strValue += StrDate + "\r\n";
   }
   //strValue = Reader.ReadToEnd();
  }
  return strValue;
 }
 
 /// <summary>
 /// Post方法
 /// </summary>
 /// <param name="posturl">URL</param>
 /// <param name="postData">Post数据</param>
 /// <returns></returns>
 public string PostPage(string posturl, string postData)
 {
  Stream outstream = null;
  Stream instream = null;
  StreamReader sr = null;
  HttpWebResponse response = null;
  HttpWebRequest request = null;
  Encoding encoding = Encoding.UTF8;
  byte[] data = encoding.GetBytes(postData);
  // 准备请求...
  try
  {
   // 设置参数
   request = WebRequest.Create(posturl) as HttpWebRequest;
   CookieContainer cookieContainer = new CookieContainer();
   request.CookieContainer = cookieContainer;
   request.AllowAutoRedirect = true;
   request.Method = "POST";
   request.ContentType = "application/x-www-form-urlencoded";
   request.ContentLength = data.Length;
   outstream = request.GetRequestStream();
   outstream.Write(data, 0, data.Length);
   outstream.Close();
   //发送请求并获取相应回应数据
   response = request.GetResponse() as HttpWebResponse;
   //直到request.GetResponse()程序才开始向目标网页发送Post请求
   instream = response.GetResponseStream();
   sr = new StreamReader(instream, encoding);
   //返回结果网页(html)代码
   string content = sr.ReadToEnd();
   string err = string.Empty;
   return content;
  }
  catch (Exception ex)
  {
   string err = ex.Message;
   return string.Empty;
  }
 }
 
 /// <summary>
 /// 格式化字符串
 /// </summary>
 /// <param name="str"></param>
 /// <returns></returns>
 public string GetFormatStr(string str)
 {
  if ("" == str)
   return "";
  else
  {
   str = str.Trim();
   str = str.Replace("&#39;", "&#39;");
   str = str.Replace("〈", "<");
   str = str.Replace("〉", ">");
   str = str.Replace(",", ",");
   return str;
  }
 }
 string ls_username = "";
 /// <summary>
 /// 用户名
 /// </summary>
 public string Wx_username
 {
  get
  {
   return ls_username;
  }
  set
  {
   ls_username = value;
  }
 }
 string ls_openid = "";
 /// <summary>
 /// Openid
 /// </summary>
 public string Wx_openid
 {
  get
  {
   return ls_openid;
  }
  set
  {
   ls_openid = value;
  }
 }
}
로그인 후 복사

INIFile.cs代码:

class INIFile
{
 ///// <summary>
 ///// 设置INI文件参数
 ///// </summary>
 ///// <param name="section">INI文件中的段落</param>
 ///// <param name="key">INI文件中的关键字</param>
 ///// <param name="val">INI文件中关键字的数值</param>
 ///// <param name="filePath">INI文件的完整的路径和名称</param>
 ///// <returns></returns>
 //[DllImport("kernel32")]
 //private static extern long WritePrivateProfileString(
 // string section, string key, string val, string filePath);
 
 ///// <summary>
 ///// 获取INI文件参数
 ///// </summary>
 ///// <param name="section">INI文件中的段落名称</param>
 ///// <param name="key">INI文件中的关键字</param>
 ///// <param name="def">无法读取时候时候的缺省数值</param>
 ///// <param name="retVal">读取数值</param>
 ///// <param name="size">数值的大小</param>
 ///// <param name="filePath">INI文件的完整路径和名称</param>
 //[DllImport("kernel32")]
 //private static extern int GetPrivateProfileString(
 // string section, string key, string def, StringBuilder retVal, int size, string filePath);
 
 //static string gs_FileName = System.AppDomain.CurrentDomain.BaseDirectory + "Config.ini";
 
 ///// <summary>
 ///// 获取INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落名称</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_FileName">INI文件的完整路径和名称</param>
 //public static string GetINIString(string as_section, string as_key, string as_FileName)
 //{
 // StringBuilder temp = new StringBuilder(255);
 // int i = GetPrivateProfileString(as_section, as_key, "", temp, 255, as_FileName);
 // return temp.ToString();
 //}
 ///// <summary>
 ///// 获取INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落名称</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_FileName">INI文件的完整路径和名称</param>
 //public static string GetINIString(string as_section, string as_key)
 //{
 // return GetINIString(as_section, as_key, gs_FileName);
 //}
 
 ///// <summary>
 ///// 设置INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_Value">INI文件中关键字的数值</param>
 ///// <param name="as_FileName">INI文件的完整路径和名称</param>
 //public static long SetINIString(string as_section, string as_key, string as_Value, string as_FileName)
 //{
 // return WritePrivateProfileString(as_section, as_key, as_Value, as_FileName);
 //}
 ///// <summary>
 ///// 设置INI文件参数
 ///// </summary>
 ///// <param name="as_section">INI文件中的段落</param>
 ///// <param name="as_key">INI文件中的关键字</param>
 ///// <param name="as_Value">INI文件中关键字的数值</param>
 //public static long SetINIString(string as_section, string as_key, string as_Value)
 //{
 // return SetINIString(as_section, as_key, as_Value, gs_FileName);
 //}
 /// <summary>
 /// 写入INI文件
 /// </summary>
 /// <param name="section">节点名称[如[TypeName]]</param>
 /// <param name="key">键</param>
 /// <param name="val">值</param>
 /// <param name="filepath">文件路径</param>
 /// <returns></returns>
 [DllImport("kernel32")]
 public static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
 [DllImport("kernel32.dll")]
 public extern static int GetPrivateProfileSectionNamesA(byte[] buffer, int iLen, string fileName);
 /// <summary>
 /// 写入INI文件(section:节点名称 key:键 val:值)
 /// </summary>
 /// <param name="section">节点名称</param>
 /// <param name="key">键</param>
 /// <param name="val">值</param>
 /// <returns></returns>
 public static long SetINIString(string section, string key, string val, string as_FilePath = "")
 {
  if (as_FilePath == "")
  {
   return (WritePrivateProfileString(section, key, val, strFilePath));
  }
  else
  {
   return (WritePrivateProfileString(section, key, val, as_FilePath)); 
  }
 }
 /// <summary>
 /// 读取INI文件
 /// </summary>
 /// <param name="section">节点名称</param>
 /// <param name="key">键</param>
 /// <param name="def">值</param>
 /// <param name="retval">stringbulider对象</param>
 /// <param name="size">字节大小</param>
 /// <param name="filePath">文件路径</param>
 /// <returns></returns>
 [DllImport("kernel32")]
 public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath);
 public static string strFilePath = Application.StartupPath + "\\Config.ini";//获取INI文件默认路径
 public static string strSec = "";
 
 //INI文件名
 
 
 /// <summary>
 /// 读取INI文件中的内容方法 (Section 节点名称;key 键)
 /// </summary>
 /// <param name="Section">节点名称</param>
 /// <param name="key">键</param>
 /// <returns></returns>
 public static string ContentValue(string Section, string key, string as_FilePath = "")
 {
 
  StringBuilder temp = new StringBuilder(1024);
  if (as_FilePath == "")
  {
   GetPrivateProfileString(Section, key, "", temp, 1024, strFilePath);
  }
  else
  {
   GetPrivateProfileString(Section, key, "", temp, 1024, as_FilePath); 
  }
  return temp.ToString();
 }
 /// <summary>
 /// 获取指定小节所有项名和值的一个列表 
 /// </summary>
 /// <param name="section">节 段,欲获取的小节。注意这个字串不区分大小写</param>
 /// <param name="buffer">缓冲区 返回的是一个二进制的串,字符串之间是用"\0"分隔的</param>
 /// <param name="nSize">缓冲区的大小</param>
 /// <param name="filePath">初始化文件的名字。如没有指定完整路径名,windows就在Windows目录中查找文件</param>
 /// <returns></returns>
 [DllImport("kernel32")]
 public static extern int GetPrivateProfileSection(string section, byte[] buffer, int nSize, string filePath);
 /// <summary>
 /// 获取指定段section下的所有键值对 返回集合的每一个键形如"key=value"
 /// </summary>
 /// <param name="section">指定的段落</param>
 /// <param name="filePath">ini文件的绝对路径</param>
 /// <returns></returns>
 public static List<string> ReadKeyValues(string section, string as_FilePath = "")
 {
  byte[] buffer = new byte[32767];
  List<string> list = new List<string>();
  int length = 0;
  if (as_FilePath == "")
  {
   length = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), strFilePath);
  }
  else
  {
   length = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), as_FilePath); 
  }
  string temp;
  int postion = 0;
  for (int i = 0; i < length; i++)
  {
   if (buffer[i] == 0x00) //以&#39;\0&#39;来作为分隔
   {
    temp = System.Text.ASCIIEncoding.Default.GetString(buffer, postion, i - postion).Trim();
    postion = i + 1;
    if (temp.Length > 0)
    {
     list.Add(temp);
    }
   }
  }
  return list;
 }
 /// <summary>
 /// 删除指定的key
 /// </summary>
 /// <param name="section">要写入的段落名</param>
 /// <param name="key">要删除的键</param>
 /// <param name="fileName">INI文件的完整路径和文件名</param>
 public static void DelKey(string section, string key, string as_FilePath = "")
 {
  if (as_FilePath == "")
  {
   WritePrivateProfileString(section, key, null, strFilePath);
  }
  else
  {
   WritePrivateProfileString(section, key, null, as_FilePath);
  }
 }
 /// <summary>
 /// 返回该配置文件中所有Section名称的集合
 /// </summary>
 public static ArrayList ReadSections()
 {
  byte[] buffer = new byte[65535];
  int rel = GetPrivateProfileSectionNamesA(buffer, buffer.GetUpperBound(0), strFilePath); 
  int iCnt, iPos;
  ArrayList arrayList = new ArrayList();
  string tmp;
  if (rel > 0)
  {
   iCnt = 0; iPos = 0;
   for (iCnt = 0; iCnt < rel; iCnt++)
   {
    if (buffer[iCnt] == 0x00)
    {
     tmp = System.Text.ASCIIEncoding.UTF8.GetString(buffer, iPos, iCnt - iPos).Trim();
     iPos = iCnt + 1;
     if (tmp != "")
      arrayList.Add(tmp);
    }
   }
  }
  return arrayList;
 } 
}
로그인 후 복사

运行结果:

ASP.NET WeChat 공개 계정 고객 서비스 인터페이스

ASP.NET WeChat 공개 계정 고객 서비스 인터페이스

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Scrapy는 WeChat 공개 계정 기사의 크롤링 및 분석을 구현합니다. Scrapy는 WeChat 공개 계정 기사의 크롤링 및 분석을 구현합니다. Jun 22, 2023 am 09:41 AM

Scrapy는 WeChat 공개 계정의 기사 크롤링 및 분석을 구현합니다. WeChat은 최근 몇 년 동안 인기 있는 소셜 미디어 애플리케이션이며, 여기서 운영되는 공개 계정도 매우 중요한 역할을 합니다. 우리 모두 알고 있듯이 WeChat 공개 계정은 정보와 지식의 바다입니다. 왜냐하면 각 공개 계정은 기사, 그래픽 메시지 및 기타 정보를 게시할 수 있기 때문입니다. 이 정보는 언론보도, 학술연구 등 다양한 분야에서 폭넓게 활용될 수 있습니다. 그래서 이 글에서는 Scrapy 프레임워크를 사용하여 WeChat 공개 계정 글을 크롤링하고 분석하는 방법을 소개하겠습니다. Scr

WeChat 공식 계정 인증과 비인증의 차이점은 무엇인가요? WeChat 공식 계정 인증과 비인증의 차이점은 무엇인가요? Sep 19, 2023 pm 02:15 PM

WeChat 공개 계정 인증과 비인증의 차이점은 인증 로고, 기능 권한, 푸시 빈도, 인터페이스 권한 및 사용자 신뢰에 있습니다. 자세한 소개: 1. 인증 로고 인증된 공개 계정은 파란색 V 로고인 공식 인증 로고를 얻게 됩니다. 이 로고는 공개 계정의 신뢰성과 권위를 높이고 사용자가 실제 공식 공개 계정을 더 쉽게 식별할 수 있게 해줍니다. 2. 기능 허가. 인증된 공개 계정은 비인증 공개 계정보다 더 많은 기능과 권한을 갖습니다. 예를 들어, 인증된 공개 계정은 온라인 결제 및 상업 운영 등을 위해 WeChat 결제 기능을 활성화할 수 있습니다.

Python의 실제 크롤러 전투: WeChat 공개 계정 크롤러 Python의 실제 크롤러 전투: WeChat 공개 계정 크롤러 Jun 10, 2023 am 09:01 AM

Python은 강력한 데이터 처리 및 웹 크롤링 기능을 갖춘 우아한 프로그래밍 언어입니다. 디지털 시대에 인터넷은 엄청난 양의 데이터로 가득 차 있으며, 크롤러는 데이터를 얻는 중요한 수단이 되었습니다. 따라서 데이터 분석 및 마이닝에 Python 크롤러가 널리 사용됩니다. 이 기사에서는 Python 크롤러를 사용하여 WeChat 공개 계정 기사 정보를 얻는 방법을 소개합니다. WeChat 공식 계정은 온라인에 기사를 게시하는 인기 있는 소셜 미디어 플랫폼이며 많은 기업과 셀프 미디어의 홍보 및 마케팅을 위한 중요한 도구입니다.

PHP를 사용하여 WeChat 공개 계정 API 인터페이스 구축 PHP를 사용하여 WeChat 공개 계정 API 인터페이스 구축 May 13, 2023 pm 12:01 PM

오늘날 인터넷 시대에 WeChat 공식 계정은 점점 더 많은 회사의 중요한 마케팅 채널이 되었습니다. WeChat 공식 계정에 더 많은 기능을 구현하려면 해당 인터페이스를 작성해야 하는 경우가 많습니다. 이 기사에서는 PHP 언어를 예로 들어 WeChat 공개 계정 API 인터페이스를 구축하는 방법을 소개합니다. 1. 준비 WeChat 공개 계정 API 인터페이스를 작성하기 전에 개발자는 WeChat 공개 계정 계정을 보유하고 WeChat 공개 플랫폼에서 개발자 인터페이스 권한을 신청해야 합니다. 신청이 성공적으로 완료되면 관련 개발자 AppID 및 AppSe를 얻을 수 있습니다.

Laravel을 사용하여 WeChat 공개 계정 기반 온라인 주문 시스템을 개발하는 방법 Laravel을 사용하여 WeChat 공개 계정 기반 온라인 주문 시스템을 개발하는 방법 Nov 02, 2023 am 09:42 AM

Laravel을 사용하여 WeChat 공식 계정을 기반으로 온라인 주문 시스템을 개발하는 방법 WeChat 공식 계정이 널리 사용됨에 따라 점점 더 많은 회사가 이를 온라인 마케팅의 중요한 채널로 사용하기 시작했습니다. 케이터링 업계에서 WeChat 공개 계정을 기반으로 한 온라인 주문 시스템을 개발하면 기업의 효율성과 매출을 향상시킬 수 있습니다. 이 글에서는 Laravel 프레임워크를 사용하여 이러한 시스템을 개발하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 프로젝트 준비 먼저 로컬 환경에 Laravel 프레임워크가 설치되어 있는지 확인해야 합니다. 좋아요

공식 계정은 하루에 한 개의 글만 올릴 수 있나요? 공식 계정은 하루에 한 개의 글만 올릴 수 있나요? Jun 16, 2023 pm 02:04 PM

공개 계정은 하루에 하나의 기사를 게시할 수 있을 뿐만 아니라 동시에 최대 8개의 기사를 게시할 수 있습니다. 여러 기사를 게시하는 방법: 1. 왼쪽의 "자료 관리"를 클릭한 후 "새 그래픽 및 텍스트 자료"를 클릭합니다. 첫 번째 기사 편집을 시작합니다. 2. 첫 번째 기사를 편집한 후 왼쪽 첫 번째 기사 아래에 있는 + 기호를 클릭하고 "그래픽 메시지"를 클릭하여 두 번째 기사를 편집합니다. 3. 여러 이미지와 텍스트를 편집한 후 "저장"을 클릭합니다. 대량으로 보내기'를 선택하면 여러 기사의 게시가 완료됩니다.

Go 언어 프레임워크를 사용하여 WeChat 공개 계정 애플리케이션 구축 Go 언어 프레임워크를 사용하여 WeChat 공개 계정 애플리케이션 구축 Jun 04, 2023 am 10:40 AM

인터넷의 인기와 모바일 장치의 광범위한 사용으로 인해 WeChat 공식 계정은 기업 마케팅에 없어서는 안될 부분이 되었습니다. WeChat 공개 계정을 통해 기업은 사용자와 쉽게 상호작용하고, 제품과 서비스를 홍보하며, 브랜드 인지도를 높일 수 있습니다. WeChat 공개 계정 애플리케이션을 더 잘 개발하기 위해 점점 더 많은 개발자와 회사가 Go 언어를 사용하여 WeChat 공개 계정 애플리케이션을 구축하기로 선택하고 있습니다. Go 언어는 Google이 개발한 프로그래밍 언어로, 구문이 간결하고 고성능, 동시성이 뛰어난 실시간 애플리케이션을 구축하는 데 적합합니다. 사용 편의성 측면에서

PHP 및 WeChat 공개 계정 개발 가이드 PHP 및 WeChat 공개 계정 개발 가이드 Jun 11, 2023 pm 03:31 PM

소셜 네트워크에서 WeChat 공개 계정이 점차 인기를 끌면서 점점 더 많은 개발자가 WeChat 공개 계정 개발 분야에 참여하기 시작했습니다. 그 중 일반적인 백엔드 프로그래밍 언어인 PHP도 WeChat 공개 계정 개발에 널리 사용되기 시작했습니다. 이 글에서는 WeChat 공개 계정 개발에 있어서 PHP의 기본 지식과 공통 기술을 소개합니다. 1. PHP 및 WeChat 공개 계정 개발의 기본 WeChat 공개 계정 개발 WeChat 공개 계정은 사용자에게 정보 푸시와 같은 다양한 유형의 서비스와 콘텐츠를 제공할 수 있는 WeChat 플랫폼을 기반으로 하는 인터넷 애플리케이션을 의미합니다.

See all articles