ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1305|回复: 1

[求助] 移动公司满意度调查数据采集

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-10-26 09:29 | 显示全部楼层 |阅读模式
本帖最后由 luqiwe 于 2021-10-26 15:16 编辑

      移动公司满意度调查数据采集页是通过请求后台再生成前端网页的,网址:http://interzjmcrm.zj.chinamobile.com/mssp/dx/NFlyMwY77S1e,通过页面调试取得请求基础参数如下:
  • 请求 URL:
    http://interzjmcrm.zj.chinamobile.com/mssp/page/c3VydmV5Q2xpZW50/pc/survey-front/service?isconvert=true&action=SURVEY_CHECK_001
  • 请求方法:
    POST
  • 远程地址:
    218.205.68.116:80
  • 引用站点策略:
    strict-origin-when-cross-origin
  • 请求标头:


      • Accept:
        application/json, text/plain, */*
      • Accept-Encoding:
        gzip, deflate
      • Accept-Language:
        zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
      • Connection:
        keep-alive
      • Content-Length:
        63
      • Content-Type:
        application/json;charset=UTF-8
      • Cookie:
        JSESSIONID=98DD07B48D7F3DFD101C4B8D99579262; SESSION_COOKIE=ssp-crm-web.8256195a-35c6-11ec-a69e-024242d764be
      • Host:
        interzjmcrm.zj.chinamobile.com
      • Origin:
        http://interzjmcrm.zj.chinamobile.com
      • Referer:
        http://interzjmcrm.zj.chinamobile.com/mssp/page/surveyClient?goback=true&extSysCode=EA3DCCC5459B44F8D8AF9B27947F5CC8&orgId=4E97A6973C19755C&BillId=AB01054A37D12402321D1A377294AD3D3C299656D882771F&ContentId=02E8FD79D59D590C
      • User-Agent:
        Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30
      • 由此我设计以下代码:
      • Function Ajax_Post(ByVal StrUrl As String, Optional ByVal StrData As String, Optional ByVal Index As Long) As Variant    On Error GoTo MyError:    Dim Object As Object, S As String, B() As Byte    Set Object = CreateObject("Microsoft.XMLHTTP")    'Set Object = CreateObject("WINHTTP.WinHttpRequest.5.1")    Object.Open "POST", StrUrl, False    Object.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"    Object.setRequestHeader "Cookie", "JSESSIONID=637D2531A641D7F9FA5ED528A1264631; JSESSIONID=57418E46D57B8549B21BDBF57123D300; interzjmcrmok=interzjmcrm_66; SESSION_COOKIE=ssp-crm-web.542641bc-33f5-11ec-bb70-02421cd83759"    'Object.setRequestHeader "Content-Length", LenB(StrConv(StrData, vbFromUnicode))    Object.setRequestHeader "Content-Length", Len(StrData)    Object.setRequestHeader "Referer", "http://interzjmcrm.zj.chinamobile.com/mssp/page/surveyClient?goback=true&extSysCode=EA3DCCC5459B44F8D8AF9B27947F5CC8&orgId=4E97A6973C19755C&BillId=AB01054A37D12402321D1A377294AD3D3C299656D882771F&ContentId=02E8FD79D59D590C"    Object.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30"    Object.send (StrData)    Do Until Object.ReadyState = 4        DoEvents    Loop    Select Case Index        Case 1: S = Object.responseText: Ajax_Post = S '返回字符串        Case 2: B = Object.responseBody: Ajax_Post = B '返回二进制        Case 3: S = BytesToStr(Object.responseBody): Ajax_Post = S '二进制转字符串[直接返回字串出现乱码时尝试]        Case Else: Ajax_Post = vbNullString '无效的返回    End Select    Set Object = Nothing '释放空间    Exit FunctionMyError:    Ajax_Post = vbNullString '出错返回空End FunctionFunction BytesToStr(ByVal vIn) As String  Dim strReturn As String, ThisCharCode As String, NextCharCode As String, I As Long  For I = 1 To LenB(vIn)    ThisCharCode = AscB(MidB(vIn, I, 1))    If ThisCharCode < &H80 Then      strReturn = strReturn & Chr(ThisCharCode)    Else      NextCharCode = AscB(MidB(vIn, I + 1, 1))      strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))      I = I + 1    End If  Next  BytesToStr = strReturnEnd FunctionPrivate Sub Command1_Click()    Dim Url As String, Key As Variant, JsonKey As String    Url = "http://interzjmcrm.zj.chinamobile.com/mssp/page/c3VydmV5Q2xpZW50/pc/survey-front/service"     '注:
        JsonKey 摸拟JSON格式,对很多网站的JSON请求数据不能写成字串,否则服务器当未取得。
      •     JsonKey = "{" & Chr(34) & "isconvert" & Chr(34) & ":" & Chr(34) & "true" & Chr(34) & "," & Chr(34) & "action" & Chr(34) & ":" & Chr(34) & "SURVEY_CHECK_001" & Chr(34) & "}"      debug.print  Ajax_Post(Url, JsonKey, 1)End Sub
      • 返回结果为:
      • {"homepageUrl":"","id":"","retCode":"-9999","retMessage":"","trace":"","userMsg":""}
      • 而调试页面的返回结果为:

        • {isAnony: "0", isReplied: "0", retCode: "200", retDtl: "", retMessage: "", state: "0",…}
          • imgSrc: ""
          • isAnony: "0"
          • isReplied: "0"
          • redirectUrl: ""
          • retCode: "200"
          • retDtl: ""
          • retMessage: ""
          • state: "0"
          • surveyData: {surveyType: 1, Desc: "感谢您参加浙江移动满意度调查,请针对以下问题进行打分,10分表示非常满意,1分表示非常不满意", SurveyId: 90002968,…}
          • surveyId: "90002968"
          • validState: "1"
      • 显然VBA未能取得服务器数据,这里请数据采集高手指点,谢谢!


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-10-28 23:29 | 显示全部楼层
没人回复,经过这几天测试,我做个自问自答吧:
Sub loadjson()

     Dim strText As String
     Dim strCookie As String
     
     myjson = "{" & Chr(34) & "SUrl" & Chr(34) & ":" & Chr(34) & "NFlyMwY77S1e" & Chr(34) & "}"
   
     With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", "http://interzjmcrm.zj.chinamobile.com/mssp/page/dx?surl=NFlyMwY77S1e", False
        .send
        strText = .getAllResponseHeaders '获取所有的回应头信息
     End With
   
     strCookie = Trim(Split(Split(strText, "Set-Cookie:")(1), ";")(0)) & ";" & Trim(Split(Split(strText, "Set-Cookie:")(2), ";")(0))
     With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "POST", "http://interzjmcrm.zj.chinamobile.com/mssp/page/ZHg=/pc/service?isconvert=true&action=SEND_MSG_QRY_001", False
        .setRequestHeader "Cookie", strCookie
        .send (myjson)
        strText = .getAllResponseHeaders '获取所有的回应头信息
        mytxt = .responseText
     End With
     mytxt = Split(Split(mytxt, "&")(3), "=")(1)
  
     myjson = "{" & Chr(34) & "recordId" & Chr(34) & ":" & Chr(34) & mytxt & Chr(34) & "}"
     With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "POST", "http://interzjmcrm.zj.chinamobile.com/mssp/page/c3VydmV5Q2xpZW50/pc/survey-front/service?isconvert=true&action=SURVEY_CHECK_001", False
        .setRequestHeader "Cookie", strCookie
        .send (myjson)
        strText = .getAllResponseHeaders '获取所有的回应头信息
        mytxt = .responseText
      End With
      Debug.Print mytxt
End Sub

很奇怪的是,用不同IP上网,移动网站都能判断当前用户已经完成提交过问卷,可始我以为是cookie的问题,将浏览器中的Cookie删除后再进行测试,移动网站也能判断当前用户历史上已参与过了该问卷调查,由于问卷调查是匿名式的,我一直很困惑移动网站是依据什么条件判断出当前电脑用户参与过了问卷调查。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-8 21:10 , Processed in 0.032531 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表