1. 程式人生 > >易語言 登陸QQ 獲取商品 推送QQ群訊息

易語言 登陸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)

.如果真結束