易语言 登陆QQ 获取商品 推送QQ群消息

这是易语言的第二篇文章 这里记录了如何登陆QQ , 以及获取多多进宝的订单 , 还有发送群消息。

主要技术点 解析json,QQ心跳,发送http请求。
使用的模块有
精易模块/chat模块(用于登陆QQ)/json(json处理)/winsock(发送http请求,可以用精易模块代替,不过精易模块运行速度比较慢winsock是自己写的调用底层的模块)

总结:
因为是第一次写易语言所以有很多地方都不规范,
1.因为平时都是写java的所以将一些可以复用的东西单独抽成一个方法进行调用。
2.易语言的语法与其他语言的语法逻辑上有很大的不同需要一段时间熟悉,但是一旦熟悉之后书写还是挺简单的。主要不方便的地方还是需要多次转型。
3.如果易语言想要写的快,程序运行的快还是需要去找一些调用底层方法的模块,更简单更灵活,但是需要一定的编程基础。

代码中都有注释 自行参考

全局变量

.版本 2

.全局变量 全局变量_多多进宝_passid, 文本型
.全局变量 全局变量_多多进宝_cookie, 文本型, , , 登陆后赋值
.全局变量 全局变量_堆乐族json, 类_json
.全局变量 全局变量_推广位pid, 文本型
.全局变量 g_QQ, SmartQQ
.全局变量 g_QQ_list, SmartQQ, , "0"

登陆多多进宝

.版本 2

.程序集 窗口程序集_启动窗口

.子程序 _按钮1_被单击
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 ADD_数据包, 类_POST数据类
.局部变量 局_提交数据, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回协议, 文本型
.局部变量 取中间返回值, 文本型, , "0"
.局部变量 局_返回, 文本型
.局部变量 局_json, 类_json, , , 局返回json
.局部变量 code, 整数型
.局部变量 多多进宝推广位json, 类_json




局_网址 = “https://jinbao.pinduoduo.com/network/api/account/loginPassword”
局_方式 = 1
ADD_数据包.添加 (“mobile”, 账号.内容)
ADD_数据包.添加 (“password”, 密码.内容)

局_提交数据 = ADD_数据包.获取JSON文本 ()

ADD_协议头.添加 (“Cookie”, “api_uid=rBQGw1v49zQ37EHKxVUtAg==”)

ADD_协议头.添加 (“Content-Type”, “application/json;charset=UTF-8”)

局_提交协议头 = ADD_协议头.获取协议头数据 ()

局_结果 = 到字节集 (网页_访问S (局_网址, 局_方式, 局_提交数据, , , 局_提交协议头, 局_返回协议, , , , , , , , , , , ))

局_返回 = 到文本 (局_结果)

局_json.解析 (编码_utf8到gb2312 (局_返回))
code = 到数值 (局_json.取通用属性 (“errorCode”))
.如果 (code = 1000000)
    文本_取中间_批量 (局_返回协议, “DDJB_PASS_ID=”, “;”, 取中间返回值)
    全局变量_多多进宝_cookie = “api_uid=rBQGw1v49zQ37EHKxVUtAg==;DDJB_PASS_ID=” + 取中间返回值 [1]

    ' 获取推广位json
    取多多进宝订单数据 (多多进宝推广位json, “https://jinbao.pinduoduo.com/network/api/promotion/promotionList”)
    全局变量_推广位pid = 多多进宝推广位json.取通用属性 (“promotionChannelList[0].pid”)

    .如果 (全局变量_推广位pid ≠ “”)
        载入 (_管理窗口, , 假)
        销毁 ()
    .否则
        登陆提示.标题 = “请先添加推广位”
    .如果结束

.否则

.如果结束

登陆提示.标题 = 到文本 (局_json.取通用属性 (“errorMsg”))



.子程序 _图形按钮_close_被单击

销毁 ()

.子程序 __启动窗口_创建完毕

' _DuoDuoJB ()

管理窗口

.版本 2
.支持库 iext
.支持库 EThread

.程序集 窗口程序集_管理窗口

.子程序 __管理窗口_创建完毕

高度 = 高度 - 30
_图形按钮_friends_被单击 ()

' _DuoDuoJB ()

.子程序 _图形按钮_min_被单击

位置 = 2

.子程序 _图形按钮_close_被单击

销毁 ()

.子程序 _图形按钮_改变状态
.参数 s_Option, 整数型

连续赋值 (假, 图形按钮_disscuss.选中, 图形按钮_friends.选中, 图形按钮_groups.选中, 图形按钮_more.选中)
连续赋值 (0, 图形按钮_disscuss.类型, 图形按钮_friends.类型, 图形按钮_groups.类型, 图形按钮_more.类型)

.判断开始 (s_Option = 1)
    图形按钮_disscuss.类型 = 1
    图形按钮_disscuss.选中 = 真
.判断 (s_Option = 2)
    图形按钮_friends.类型 = 1
    图形按钮_friends.选中 = 真
.判断 (s_Option = 3)
    图形按钮_groups.类型 = 1
    图形按钮_groups.选中 = 真
.判断 (s_Option = 4)
    图形按钮_more.类型 = 1
    图形按钮_more.选中 = 真
.默认

.判断结束


.子程序 _图形按钮_disscuss_被单击

_图形按钮_改变状态 (1)
选择夹_主体.可视 = 假
选择夹_主体.现行子夹 = 0
选择夹_主体.可视 = 真

.子程序 _图形按钮_friends_被单击
.局部变量 多多进宝推广位json, 类_json
.局部变量 i, 整数型
.局部变量 索引, 整数型

_图形按钮_改变状态 (2)
选择夹_主体.可视 = 假
选择夹_主体.现行子夹 = 1
选择夹_主体.可视 = 真
进度条.位置 = 0

超级列表框_商品.全部删除 ()

进度条.位置 = 10

' 获取到多多进宝推广位json数据
' 取多多进宝订单数据 (多多进宝推广位json, “https://jinbao.pinduoduo.com/network/api/promotion/promotionList”)

' 进度条.位置 = 20

' 全局变量_推广位pid = 多多进宝推广位json.取通用属性 (“promotionChannelList[0].pid”)

' 进度条.位置 = 30

' 取堆乐族json数据
取堆乐族推广数据 (全局变量_堆乐族json)
进度条.位置 = 40
.计次循环首 (全局变量_堆乐族json.成员数 (“data”), i)
    索引 = 超级列表框_商品.插入表项 (, , , , , )
    ' 商品名
    超级列表框_商品.置标题 (索引, 0, 全局变量_堆乐族json.取通用属性 (“data[” + 到文本 (i - 1) + “].title”))
    ' 剩余抵扣卷
    超级列表框_商品.置标题 (索引, 1, 全局变量_堆乐族json.取通用属性 (“data[” + 到文本 (i - 1) + “].generalize_deduction”))
    ' 佣金
    超级列表框_商品.置标题 (索引, 2, 全局变量_堆乐族json.取通用属性 (“data[” + 到文本 (i - 1) + “].piecework_price”))
    ' 商品id
    超级列表框_商品.置标题 (索引, 3, 全局变量_堆乐族json.取通用属性 (“data[” + 到文本 (i - 1) + “].behavior”))
    i = i + 1
.计次循环尾 ()
进度条.位置 = 100

.子程序 _图形按钮_groups_被单击


_图形按钮_改变状态 (3)
选择夹_主体.可视 = 假
选择夹_主体.现行子夹 = 2
选择夹_主体.可视 = 真



.子程序 _图形按钮_more_被单击
.局部变量 多多进宝订单json, 类_json
.局部变量 i, 整数型
.局部变量 索引, 整数型
.局部变量 time, 日期时间型

_图形按钮_改变状态 (4)
选择夹_主体.可视 = 假
选择夹_主体.现行子夹 = 3
选择夹_主体.可视 = 真


超级列表框_订单.全部删除 ()

' 获取到多多进宝订单json数据
取多多进宝订单数据 (多多进宝订单json, “https://jinbao.pinduoduo.com/network/api/order/list”)

.计次循环首 (多多进宝订单json.成员数 (“list”), i)
    索引 = 超级列表框_订单.插入表项 (, , , , , )

    ' 支付时间
    time = 时间_格林威治转北京 (到长整数 (多多进宝订单json.取通用属性 (“list[” + 到文本 (i - 1) + “].groupSuccessTime”)))
    超级列表框_订单.置标题 (索引, 0, 到文本 (time))
    ' 订单号
    超级列表框_订单.置标题 (索引, 1, 多多进宝订单json.取通用属性 (“list[” + 到文本 (i - 1) + “].orderSn”))
    ' 商品信息
    超级列表框_订单.置标题 (索引, 2, 多多进宝订单json.取通用属性 (“list[” + 到文本 (i - 1) + “].goodsName”))
    ' 订单价格
    超级列表框_订单.置标题 (索引, 3, 到文本 (到数值 (多多进宝订单json.取通用属性 (“list[” + 到文本 (i - 1) + “].goodsPrice”)) × 0.01))

.计次循环尾 ()



.子程序 _标签_剩余_反馈事件, 整数型
.参数 参数一, 整数型
.参数 参数二, 整数型






.子程序 _选择夹_主体_被单击






.子程序 获取推广数据
.参数 msgList, 文本型, 参考 可空 数组
.局部变量 被选索引数组, 整数型, , "0"
.局部变量 i, 整数型


取超级列表框被选中项 (超级列表框_商品, 被选索引数组)
.计次循环首 (取数组成员数 (被选索引数组), i)
    加入成员 (msgList, 多多进宝商品推广 (超级列表框_商品.取标题 (被选索引数组 [i], 3)))
.计次循环尾 ()


.子程序 取超级列表框被选中项, 整数型, , 返回复选框选中数量,0表示未选中
.参数 超级列表框, 超级列表框
.参数 被选索引数组, 整数型, 参考 可空 数组, 取出被选中的表项索引,提供整数型数组
.局部变量 i, 整数型

i = 0
.计次循环首 (超级列表框.取表项数 (), i)  ' 遍历超级列表框中所有项目
    .如果真 (超级列表框.取当前状态图片 (i - 1) = 1)  ' 查看是否被选中,0=选中,1未选中
        .如果真 (取反 (是否为空 (被选索引数组)))  ' 没有参数就不执行
            加入成员 (被选索引数组, i - 1)  ' 选中则将被选表项索引加入变量
        .如果真结束

    .如果真结束

.计次循环尾 ()
返回 (取数组成员数 (被选索引数组))

.子程序 取多多进宝订单数据, , , 获取多多进宝订单
.参数 json, 类_json, 参考 可空, 订单数据json
.参数 url, 文本型, 参考, 请求地址
.局部变量 ADD_数据包, 类_POST数据类
.局部变量 listjson, 类_json
.局部变量 http, WinHttp
.局部变量 索引, 整数型

' 地址   顺序1
http.Open (“POST”, url)

ADD_数据包.添加 (“endTime”, “1646272000000”)
ADD_数据包.添加 (“goodsId”, “”)
ADD_数据包.添加 (“orderSn”, “”)
ADD_数据包.添加 (“pageNum”, “1”)
ADD_数据包.添加 (“pageSize”, “20”)
ADD_数据包.添加 (“startTime”, “915120000000”)
ADD_数据包.添加 (“timeType”, “1”)
ADD_数据包.添加 (“version”, “2.0”)

' 协议头部 顺序2
http.SetRequestHeader (“Cookie”, 全局变量_多多进宝_cookie)
http.SetRequestHeader (“Content-Type”, “application/json;charset=UTF-8”)

' 需要发送的数据 顺序3
http.Send (到字节集 (ADD_数据包.获取JSON文本 ()))
' 顺序4
json.解析 (编码_utf8到gb2312 (http.ResponseText ()))
json = json.取属性 (“result”)


.子程序 取堆乐族推广数据, , , 获取堆乐族数据
.参数 json, 类_json, 参考 可空, 堆乐族数据json
.局部变量 ADD_数据包, 类_POST数据类
.局部变量 http, WinHttp


http.Open (“POST”, “http://192.168.1.188:10010/Demand/listAjax”)

ADD_数据包.添加 (“cid”, “28”)

http.SetRequestHeader (“Content-Type”, “application/json;charset=UTF-8”)

http.Send (到字节集 (ADD_数据包.获取JSON文本 ()))

json.解析 (编码_utf8到gb2312 (http.ResponseText ()))

msg.标题 = json.取通用属性 (“msg”)

json = json.取属性 (“data”)


.子程序 多多进宝商品推广, 文本型
.参数 goodsId, 文本型, , 商品ID
.局部变量 url_json, 类_json
.局部变量 commodity_json, 类_json
.局部变量 name, 文本型
.局部变量 couponDiscount, 整数型, , , 商品优惠价格
.局部变量 goodsFactPrice, 整数型, , , 原价


' 获取商品信息
commodity_json = 取多多进宝推广商品信息 (“https://jinbao.pinduoduo.com/network/api/common/goodsDetail”, goodsId)
' 获取推广地址
url_json = 取多多进宝推广商品信息 (“https://jinbao.pinduoduo.com/network/api/promotion/createPromotionUrl”, goodsId)
' 商品名
name = commodity_json.取通用属性 (“goodsName”)
' 优惠金额
couponDiscount = 到数值 (commodity_json.取通用属性 (“couponDiscount”))
' 原价
goodsFactPrice = 到数值 (commodity_json.取通用属性 (“goodsFactPrice”))

返回 (“商品名:<br />” + name + “原价:” + 到文本 (goodsFactPrice × 0.01) + “卷后价:” + 到文本 (goodsFactPrice × 0.01 - couponDiscount × 0.01) + “链接:” + url_json.取通用属性 (“shortUrl”))

.子程序 取多多进宝推广商品信息, 类_json
.参数 url, 文本型, , 数据请求地址
.参数 goodsId, 文本型, , 商品ID
.局部变量 ADD_数据包, 类_POST数据类
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 json, 类_json
.局部变量 http, WinHttp


http.Open (“POST”, url)

http.SetRequestHeader (“Content-Type”, “application/json;charset=UTF-8”)
http.SetRequestHeader (“Cookie”, 全局变量_多多进宝_cookie)

ADD_数据包.添加 (“pid”, 全局变量_推广位pid)
ADD_数据包.添加 (“goodsId”, goodsId)

http.Send (到字节集 (ADD_数据包.获取JSON文本 ()))

json.解析 (编码_utf8到gb2312 (http.ResponseText ()))

返回 (json.取属性 (“result”))


.子程序 _添加QQ账号_被单击

.如果真 (是否已创建 (_扫码窗口) = 假)
    载入 (_扫码窗口, _管理窗口, 假)
    _扫码窗口.图片框1.图片 = g_QQ.QRInitialize ()
.如果真结束


.子程序 _发消息_被单击

进度条.位置 = 1
启动线程 (&TXQQSyncCheck, , )



.子程序 TXQQSyncCheck
.局部变量 i, 整数型
.局部变量 x, 整数型
.局部变量 j, 整数型
.局部变量 Temp, 文本型
.局部变量 Uin, 文本型
.局部变量 json, 类_json
.局部变量 商品list, 文本型, , "0"
.局部变量 text, 文本型, , , 消息发送是否成功
.局部变量 code, 整数型
.局部变量 进度, 整数型

' 获取需要推广的商品信息
获取推广数据 (商品list)
' 清空标题
标签_剩余.标题 = “0”
标签_失败.标题 = “0”
标签_成功.标题 = “0”

标签_剩余.标题 = 到文本 (取数组成员数 (商品list) × 取数组成员数 (g_QQ_list))
进度 = 到整数 (标签_剩余.标题) ÷ 取数组成员数 (g_QQ_list)

.计次循环首 (取数组成员数 (g_QQ_list), i)
    ' 延时 (1000)
    输出调试文本 (“循环线程”)
    Temp = g_QQ_list [i].SyncCheck ()
    json.解析 (取文本右边 (g_QQ_list [i].GetGroupList (), 取文本长度 (g_QQ_list [i].GetGroupList ()) - 寻找文本 (g_QQ_list [i].GetGroupList (), “|”, , 假)))
    ' 解json格式
    json = json.取属性 (“result”)
    ' 迭代需要发送的群
    .计次循环首 (json.成员数 (“gnamelist”), x)
        ' 迭代发送商品信息
        .计次循环首 (取数组成员数 (商品list), j)
            ' 给QQ群发消息
            text = g_QQ_list [i].SendGroup (json.取通用属性 (“gnamelist[” + 到文本 (x - 1) + “].gid”), 商品list [j])
            code = 寻找文本 (text, “fail”, , 假)
            ' 1发送失败  -1 发送成功
            .如果 (code = 1)
                ' 发送失败的话
                标签_失败.标题 = 到文本 (到整数 (标签_失败.标题) + 1)
            .否则
                标签_成功.标题 = 到文本 (到整数 (标签_成功.标题) + 1)

            .如果结束
            标签_剩余.标题 = 到文本 (到整数 (标签_剩余.标题) - 1)

            延时 (3 × 1000)
        .计次循环尾 ()
    .计次循环尾 ()

    进度条.位置 = 进度条.位置 + 进度
    ' 调试输出 (g_QQ_list [i].SendFriend (“961011576”, “  -  一个测试的机器人”))


    ' 如果真 (Temp ≠ “”)
    ' 判断 (_StrBetween (Temp, 字符 (34) + “style” + 字符 (34) + “:[0,0,0]}],” + 字符 (34), 字符 (34) + “from_uin” + 字符 (34)) ≠ “”)
    ' 调试输出 (“NewMsg”, Temp)
    ' 判断 (_StrBetween (Temp, “errmsg” + 字符 (34) + “:” + 字符 (34), 字符 (34)) ≠ “”)
    ' 调试输出 (“Errors”, Temp)
    ' 调试输出 (Temp)


    ' 如果真 (i % 199 = 0)  ' 隔一段时间获取一下在线人员
    ' g_QQ_list [i].GetOnlineBuddies ()

.计次循环尾 ()
进度条.位置 = 100

QQ扫码登陆窗口

.版本 2
.支持库 EThread
.支持库 spec
.支持库 iext

.程序集 窗口程序集_扫码窗口
.程序集变量 m_hID, 整数型

.子程序 __扫码窗口_创建完毕

时钟1.时钟周期 = 1000

.子程序 __扫码窗口_将被销毁
.局部变量 Bool, 逻辑型

.如果真 (m_hID > 0)
    时钟1.时钟周期 = 0
    Bool = 关闭线程句柄 (m_hID)
    调试输出 (“关闭QQ”, Bool)
    g_QQ.Destroy ()
.如果真结束


.子程序 _时钟1_周期事件
.局部变量 Body, 文本型
.局部变量 Temp, 文本型
.局部变量 Arr, 文本型, , "0"
.局部变量 json, 类_json
.局部变量 hFile, 整数型
.局部变量 uin, 文本型, , , QQ号
.局部变量 name, 文本型, , , 昵称
.局部变量 索引, 整数型

Body = g_QQ.QRLogin (Temp)
.如果真 (Body ≈ “success|”)
    _管理窗口.进度条.标记 = “0”

    加入成员 (g_QQ_list, g_QQ)

    ' 登陆成功
    时钟1.时钟周期 = 0

    _扫码窗口.图片框1.边框 = 5

    _管理窗口.进度条.标记 = “30”

    json.解析 (取文本右边 (g_QQ.GetSelfInfo (), 取文本长度 (g_QQ.GetSelfInfo ()) - 寻找文本 (g_QQ.GetSelfInfo (), “|”, , 假)))

    uin = json.取属性 (“result”).取通用属性 (“uin”)
    name = json.取属性 (“result”).取通用属性 (“nick”)

    _管理窗口.进度条.标记 = “50”

    索引 = _管理窗口.超级列表框_QQ.插入表项 (, , , , , )
    ' QQ
    _管理窗口.超级列表框_QQ.置标题 (索引, 0, uin)
    ' 昵称
    _管理窗口.超级列表框_QQ.置标题 (索引, 1, name)

    _管理窗口.进度条.标记 = “100”

    _扫码窗口.销毁 ()
    ' 调试输出 (“群列表”, g_QQ.GetGroupList ())
    ' Temp = g_QQ.GetFriendList ()
    ' 删除文件 (取运行目录 () + “\myFriend.txt”)
    ' hFile = 打开文件 (取运行目录 () + “\myFriend.txt”, #重写, #禁止写)
    ' 移到文件尾 (hFile)
    ' 写出文本 (hFile, Temp)
    ' 关闭文件 (hFile)

.如果真结束


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值