Foxtable(狐表)用户栏目专家坐堂 → [求助]WXUsers表获取的用户姓名乱码


  共有2659人关注过本帖树形打印复制链接

主题:[求助]WXUsers表获取的用户姓名乱码

帅哥哟,离线,有人找我吗?
fczhaobo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:394 积分:4047 威望:0 精华:0 注册:2017/3/24 15:10:00
[求助]WXUsers表获取的用户姓名乱码  发帖心情 Post By:2021/4/10 1:06:00 [只看该作者]

如题,根据文档中的,jo().tostring获得的公众号用户名,和实际的出入太大,有好多乱码,不知道如何解决?


图片点击可在新窗口打开查看此主题相关图片如下:3a78e894bd29c285e075655dc011276.png
图片点击可在新窗口打开查看


 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107680 积分:547721 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/4/10 11:01:00 [只看该作者]

具体代码?

 回到顶部
帅哥哟,离线,有人找我吗?
fczhaobo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:394 积分:4047 威望:0 精华:0 注册:2017/3/24 15:10:00
  发帖心情 Post By:2021/4/10 14:32:00 [只看该作者]

DataTables("WXUsers").DataRows.Clear()
Dim ul As String = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}&next_openid={1}"  '获取用户OpenID列表接口
Dim il = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={0}" '批量获取用户信息接口
Dim nms() As String = {"openid","nickname","sex","city","country","province","headimgurl","groupid","remark","language"} '列名
Dim hc As New HttpClient(CExp(ul, Functions.Execute("GetAccessToken"),"")) 
Dim ids As New List(of String) 'OpenId集合,每次获取10000个
Dim ba As New Jarray '准备用来获取用户信息的OpenId列表,一次不能超过100个
Dim jo As JObject = JObject.Parse(hc.GetData)
Do '循环获取,一次只能获取10000个OpenID
    If jo("errcode") Is Nothing Then
        Dim cnt As Integer = jo("count")
        If cnt = 0 Then '如果已经获取完所有用户'
            Exit Do
        End If
        For Each jk As JToken  In jo("data")("openid")
            ids.Add(jk)
        Next
        For i As Integer = 0 To ids.Count - 1  '循环获取用户详情,一次不能超过100个用户
            Dim uo As New JObject
            uo("openid") = ids(i)
            ba.Add(uo)
            If ba.Count = 100 OrElse i = ids.Count - 1 Then '每满100个就获取一次
                Dim bo As New Jobject
                bo("user_list") = ba
                hc = New HttpClient(CExp(il, Functions.Execute("GetAccessToken")))
                hc.Content = bo.ToString()
                Dim ro As JObject = JObject.Parse(hc.GetData)
                If ro("errcode") Is  Nothing Then
                    Dim ia As JArray = ro("user_info_list") '获取的用户信息列表
                    For Each jt As JToken In ia
                        Dim dr As DataRow = DataTables("WXUsers").Find("openid = '" & jt("openid").ToString() & "'")
                        If dr Is Nothing Then
                            dr = DataTables("WXUsers").AddNew()
                        End If
                        For Each nm As String In nms
                            dr(nm) = jt(nm)
                        Next
                        dr("tagid_list") = CompressJSON(jt("tagid_list"))
                    Next
                Else
                    MessageBox.Show(ro.ToString)
                    Exit For
                End If
                ba.Clear() '清除集合,准备获取下一批用户详情,每批只能100个.
            End If
        Next
        ids.Clear '清除已经获取的OpenID.,准备接收下一批OpenID
        hc =  New HttpClient(CExp(ul, Functions.Execute("GetAccessToken"),jo("next_openid").Tostring))  '获取下一批OpenID
        jo = JObject.Parse(hc.GetData)
    Else
        MessageBox.Show(jo.ToString)
        Exit Do
    End If
Loop
DataTables("WXUsers").Save()

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107680 积分:547721 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/4/10 15:41:00 [只看该作者]

到命令窗口调试一下接收到的内容是什么
……
            If ba.Count = 100 OrElse i = ids.Count - 1 Then '每满100个就获取一次
                Dim bo As New Jobject
                bo("user_list") = ba
                hc = New HttpClient(CExp(il, Functions.Execute("GetAccessToken")))
                hc.Content = bo.ToString()
dim ret as string = hc.GetData
output.show(ret) '看接收到的内容是什么?
                Dim ro As JObject = JObject.Parse(ret)
                If ro("errcode") Is  Nothing Then
……

注意一下参数,是不是有繁体的用户?

参数说明

参数是否必须说明
openid用户的标识,对当前公众号唯一
lang国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN

 回到顶部