-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
itchat怎么一直登錄(無(wú)法用itchat登錄網(wǎng)頁(yè)微信)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于itchat怎么一直登錄的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
ChatGPT國(guó)內(nèi)免費(fèi)在線使用,能給你生成想要的原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
你只需要給出你的關(guān)鍵詞,它就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端,官網(wǎng):https://ai.de1919.com
本文目錄:
一、用python怎么設(shè)計(jì)一個(gè)微信的接口
最近一段時(shí)間想看看能不能用萬(wàn)能的python來(lái)對(duì)微信進(jìn)行一些操作(比如自動(dòng)搶紅包之類的...hahahaha),所以就在此記錄一下啦~~
1、安裝
sudo pip install itchat
2、登錄
itchat.auto_login()
注:itchat.auto_login()這種方法將會(huì)通過(guò)微信掃描二維碼登錄,但是這種登錄的方式確實(shí)短時(shí)間的登錄,并不會(huì)保留登錄的狀態(tài),也就是下次登錄時(shí)還是需要掃描二維碼,如果加上hotReload==True,那么就會(huì)保留登錄的狀態(tài),至少在后面的幾次登錄過(guò)程中不會(huì)再次掃描二維碼,該參數(shù)生成一個(gè)靜態(tài)文件itchat.pkl用于存儲(chǔ)登錄狀態(tài)
itchat.auto_login(hotReload=True)
3、退出登錄
主要使用的是回調(diào)函數(shù)的方法,登錄完成后的方法需要賦值在 loginCallback中退出后的方法,需要賦值在 exitCallback中.若不設(shè)置 loginCallback的值, 將會(huì)自動(dòng)刪除二維碼圖片并清空命令行顯示.
import itchat,time
def lcb():
print("登錄完成!")
def ecb():
print("退出成功!")
itchat.auto_login(loginCallback=lcb,exitCallback=ecb) #源碼中規(guī)定需要用回調(diào)函數(shù)。
time.sleep(10)
itchat.logout() #強(qiáng)制退出登錄
4、發(fā)送消息
send()
itchat.send(msg="WANGPC的微信消息!",toUserName="filehelper") #返回值為T(mén)rue或Flase
實(shí)例:
或者:
send_msg
send_msg(msg='Text Message', toUserName=None),其中的的msg是要發(fā)送的文本,toUserName是發(fā)送對(duì)象, 如果留空, 將發(fā)送給自己,返回值為T(mén)rue或者False
實(shí)例代碼
send_file
send_file(fileDir, toUserName=None) fileDir是文件路徑, 當(dāng)文件不存在時(shí), 將打印無(wú)此文件的提醒,返回值為T(mén)rue或者False
實(shí)例代碼
send_image
send_image(fileDir, toUserName=None) 參數(shù)同上
實(shí)例代碼
send_video
send_video(fileDir, toUserName=None) 參數(shù)同上
實(shí)例代碼
二、微信加長(zhǎng)代碼撤回消息
自從微信出了這個(gè)消息撤回功能小編我都已經(jīng)快被折磨死了,小編本來(lái)就是個(gè)好奇心比較重的人,微信出了這個(gè)功能之后小編感覺(jué)身體一天不如一天了,每次看著女神發(fā)來(lái)的信息又撤回,可謂是心里癢癢啊。所以小編就寫(xiě)了一個(gè)微信消息撤回捕捉器,下面就讓小編教你怎么擺脫單身逆襲白富美。
1,模塊介紹
首先的話要實(shí)現(xiàn)消息撤回捕捉得用到python上一個(gè)十分強(qiáng)大的庫(kù):itchat。如果大家沒(méi)有使用過(guò)的話小編就來(lái)介紹一下:
Project description
itchat is a open souce wechat api project for personal account.
It enables you to access your personal wechat account through command line.
以上意思就是:itchat是一個(gè)面向個(gè)人賬戶的開(kāi)源微信api項(xiàng)目。您可以通過(guò)命令行訪問(wèn)您的個(gè)人微信帳戶。 所以說(shuō)我們今天就要用到這個(gè)庫(kù),首先我們要 :
pip install itchat
2,模塊功能熟悉
小編這里考慮到有些小伙伴從來(lái)沒(méi)用過(guò)這個(gè)模塊,所以下面會(huì)對(duì)這個(gè)模塊進(jìn)行一個(gè)簡(jiǎn)單的講解。
2.1 如何登錄微信
既然我們要捕捉微信的撤回信息那第一步肯定是要先登錄微信,登錄微信非常簡(jiǎn)單只需要兩行代碼:
import itchat?itchat.login()
這樣就好了,是不是特別簡(jiǎn)單,然后運(yùn)行之后就會(huì)出現(xiàn)一個(gè)二維碼,掃描之后再手機(jī)上面授權(quán)登錄,控制臺(tái)就會(huì)顯示你是否登錄成功。
·Login successfully as .
這樣就說(shuō)明你登錄成功了,但是這邊如果是新創(chuàng)建的微信和長(zhǎng)期不使用的微信的話是無(wú)法登錄網(wǎng)頁(yè)版微信的,所以這里也會(huì)導(dǎo)致登錄不上。如果登錄不上,那也是沒(méi)有辦法的
2.2 獲取好友列表
import itchat
itchat.auto_login(hotReload=True)
friends = itchat.get_friends() # 好友列表
print(friends)
使用get_friends()這個(gè)函數(shù)就能獲取到好友列表的所有好友信息,包括昵稱,備注名,地址,個(gè)性標(biāo)簽,性別等等。
[{'UserName':
'@7c2215e17edf4b193f125d6ecf944abcaf19ba72e3eb24b8442d5e32d4a8be92',
'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial':
'', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '',
'EncryChatRoomId': '', '**': '', 'Signature': '', 'NickName': '**',
'RemarkPYQuanPin': '', 'HeadImgUrl': '**'
這里我就隨便復(fù)制了一個(gè)好友的信息,關(guān)于到隱私的問(wèn)題我就把信息全部用**代替了,我們重點(diǎn)是分析一下這些信息的內(nèi)容,比如最開(kāi)始的UserName這個(gè)是用戶的唯一標(biāo)識(shí),相當(dāng)于身份證號(hào)碼一樣的,所有的好友UserName都是不一樣的,然后是NickName:這是好友的昵稱,HeadImgUrl:這是好友的頭像地址,還有一些就不一一介紹了,大家感興趣的話可以自己去了解一下
2.3 發(fā)送信息給好友
我們現(xiàn)在準(zhǔn)備發(fā)送一條信息給好友,具體怎么操作呢?看下面代碼:
import itchat
itchat.auto_login(hotReload=True)
itchat.send("人生苦短,我學(xué)python",toUserName="@c4326bda513bf7cdd19f1fa03dbf7e7bc3bbc57e5abb71fd580b2c3c32cddd99")
itchat.send()這個(gè)函數(shù)可以放兩個(gè)參數(shù),第一個(gè)你要發(fā)送給好友的信息,第二個(gè)指定好友也就是toUserName=上面所說(shuō)的唯一身份標(biāo)識(shí)UserName但是上面方法我覺(jué)得還是有點(diǎn)不妥,然后我就改進(jìn)了一下:
import itchat
itchat.auto_login(hotReload=True)friends = itchat.get_friends()nickName = '你禿我不禿'
for i in friends:
if '你禿我不禿' == i['NickName']:
itchat.send('人生苦短,我學(xué)python', toUserName=i['UserName'])
break
這樣我就可以發(fā)信息給任意好友,通過(guò)好友的昵稱哎好友列表中進(jìn)行查找,找到的話我就獲取該好友的UserName然后發(fā)送消息,也可以通過(guò)對(duì)好友的備注名RemarkName查找,大家可以根據(jù)自己的喜好選擇
2.4 裝飾器
關(guān)于itchat這個(gè)模塊還有很多功能,小編在這里就不做過(guò)多講解了,我們只要了解消息撤回所需要的知識(shí)點(diǎn)就行了,然后我們進(jìn)行最后一個(gè)內(nèi)容,裝飾器 關(guān)于裝飾器小編這邊簡(jiǎn)單介紹一下,裝飾器的是勇于擴(kuò)展原來(lái)函數(shù)功能的一種函數(shù),目的是再不改變?cè)瘮?shù)名的情況下給函數(shù)增加新的功能。 例如我喜安智又一個(gè)函數(shù)foo(),你并不知道函數(shù)的實(shí)現(xiàn)原理,你肯定也不能去修改這個(gè)函數(shù)的代碼而你需要給這個(gè)函數(shù)添加一個(gè)輸出開(kāi)始運(yùn)行時(shí)間和結(jié)束運(yùn)行時(shí)間的功能,改如何實(shí)現(xiàn),這時(shí)候你就可以用裝飾器了:
import time
def show_time(foo):
def inner():
print(time.time()) foo() print(time.time()) return inner
@show_timedef foo(): passfoo()
上面這段代碼的意思:首先@show_time就是使用一個(gè)裝飾器show_time,這個(gè)時(shí)候就會(huì)將裝飾器的函數(shù),也就是foo()作為參數(shù)傳遞給裝飾器show_time(),我們知到函數(shù)作為返回值的話,執(zhí)行的其實(shí)是該函數(shù),所以程序會(huì)執(zhí)行內(nèi)部函數(shù)inner(),此時(shí)輸出開(kāi)始運(yùn)行時(shí)間,然后調(diào)用foo()函數(shù),最后輸出結(jié)束運(yùn)行時(shí)間,這樣就實(shí)現(xiàn)了一個(gè)功能擴(kuò)展,這也是很典型的面向切面編程思想。
3,如何監(jiān)聽(tīng)好友撤回的信息
其實(shí)到了這里我們就已經(jīng)完成了消息的監(jiān)聽(tīng)只需要稍加修改就好了,但是這個(gè)程序還是有一點(diǎn)問(wèn)題的,就是所有的消息我們都需要去保存,好友正常發(fā)送過(guò)來(lái)的消息我們直接就能看到保存下來(lái)不是多此一舉嗎,我們的目的是想知道好友撤回了什么內(nèi)容,這里就涉及到如何監(jiān)聽(tīng)好友是否撤回了信息這個(gè)問(wèn)題了,其實(shí)也不難,Content模塊為我們提供了NOTE類型,這個(gè)類型指的是系統(tǒng)消息,所以我們可以自定義一個(gè)函數(shù)用來(lái)監(jiān)聽(tīng)系統(tǒng)消息:
import itchat
from itchat.content import * # 導(dǎo)入itchat下的content模塊
itchat.auto_login(hotReload=True)
@itchat.msg_register(NOTE)
def note_info(msg): # 監(jiān)聽(tīng)系統(tǒng)消息
print(msg)
itchat.run()
運(yùn)行程序,我們撤回一條信息測(cè)試一下,輸出的結(jié)果如下:
'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Note', 'Text': '你撤回了一條消息'}
則例截取的部分的內(nèi)容這樣會(huì)發(fā)小撤回信息的文本內(nèi)容“你撤回了一條信息”,如意要想知道好友是否撤回了消息就很簡(jiǎn)單了,判斷一下,msg['Text']=='你撤回了一條信息'就行了
4, 實(shí)現(xiàn)微信消息撤回捕捉功能
現(xiàn)在關(guān)于程序的每個(gè)步驟代碼到這里也就分析完了,接下來(lái)就是對(duì)所有的代碼進(jìn)行一個(gè)總結(jié)以下就是所有代碼的總結(jié):
現(xiàn)在我們來(lái)測(cè)試一下首先我讓我兩個(gè)朋友一人給我發(fā)了一條信息:
三、Python需求:什么值得買(mǎi)登錄、簽到、搜索功能
最近想買(mǎi)個(gè)行車記錄儀,經(jīng)常在在什么值得買(mǎi)上搜索信息,感覺(jué)浪費(fèi)的時(shí)間比較多,就想用Python寫(xiě)個(gè)自動(dòng)搜索的功能。另外,什么值得買(mǎi)已經(jīng)很久沒(méi)有簽到了,剛開(kāi)始玩的時(shí)候臺(tái)天天簽到,樂(lè)此不?!,F(xiàn)在已經(jīng)很久沒(méi)有簽到了,既然我是碼農(nóng),當(dāng)然得實(shí)現(xiàn)自動(dòng)化哈。
1.實(shí)現(xiàn)自動(dòng)登錄;
2.實(shí)現(xiàn)自動(dòng)簽到;
3.實(shí)現(xiàn)搜索功能;
requests庫(kù)應(yīng)該就能實(shí)現(xiàn)這些功能,但是需要解析頁(yè)面,我這些需求簡(jiǎn)單,沒(méi)有性能要求,因此采用簡(jiǎn)單的selenium庫(kù)模擬瀏覽器操作實(shí)現(xiàn)這個(gè)需求。
selenium、BeautifulSoup
關(guān)于selenium的使用在 Python爬取煎蛋妹子圖 里有介紹。
遇到的坑:
1.點(diǎn)擊登錄按鈕后,彈出登錄框,后續(xù)無(wú)法找到用戶名、密碼的element。
開(kāi)始以為是點(diǎn)擊登錄后,馬上就去獲取這個(gè)element,此時(shí)登錄框還沒(méi)有彈出來(lái),因此延遲了3秒(這個(gè)問(wèn)題在模擬登錄百度時(shí)碰到過(guò))。依舊不能解決。問(wèn)題原因就是沒(méi)有獲取到當(dāng)前登錄框的handle,因此獲取所有的window_handle,然后切換到當(dāng)前的,debug發(fā)現(xiàn)是始終只有一個(gè)handle。
其實(shí)什么值得買(mǎi)的登錄框是一個(gè)frame,需要采用switch_to.frame方法定位到當(dāng)前frame。
搜索只處理了搜索結(jié)果的第一頁(yè),如果需要更多的數(shù)據(jù),處理分頁(yè)即可。
以上三個(gè)方法即實(shí)現(xiàn)了三個(gè)功能需求,但是我想要每天自動(dòng)實(shí)現(xiàn)登錄、簽到功能,同時(shí)搜索‘行車記錄儀’處理結(jié)果能夠發(fā)送到手機(jī)。實(shí)現(xiàn)搜索結(jié)果發(fā)送到手機(jī),自然想到了 itchat 這個(gè)庫(kù)。另外使用 apscheduler 實(shí)現(xiàn)了定時(shí)任務(wù)。
下面開(kāi)始列遇到的坑:
1.簽到時(shí)
寫(xiě)的時(shí)候沒(méi)注意,捕獲異常寫(xiě)了EOFrror,導(dǎo)致簽到過(guò)后,后續(xù)不會(huì)發(fā)送微信消息。EOFrror是意味著它發(fā)現(xiàn)了一個(gè)不期望的文件尾時(shí)會(huì)拋出的異常,因此這里不會(huì)捕獲到。
修改成:
四、基于wechaty的定時(shí)消息推送(可以哄女朋友)、智能聊天和私人助理
---
title: "基于wechaty的定時(shí)消息推送(可以哄女朋友)、智能聊天和私人助理"
author: jasonlovesharon
email: 54027901@163.com
tags:
- nodejs
- wechaty
- wechaty-puppet-padplus
---
## 前言
- 自從2017年微信web端API限制以后,itchat等一大批bot歇菜了,一直都在找一款合適的替品
- 目前來(lái)看,大部分都是針對(duì)windows微信客戶端,基于HOOK的dll注入實(shí)現(xiàn)對(duì)微信的操控,有一定的封號(hào)風(fēng)險(xiǎn),只能用固定的版本,部署在linux服務(wù)器端比較困難,意味著只能一直開(kāi)著電- -wechaty,支持IPAD,,MAC等多種協(xié)議,不用去調(diào)用WEB網(wǎng)頁(yè)API,并且可以布署在服務(wù)器,滿足我所有需求。[項(xiàng)目地址](https://github.com/wechaty/wechaty)
- 看完官方文檔后([token官方介紹](https://github.com/juzibot/welcome/wiki/everything-about-wechaty)), 發(fā)現(xiàn)需要申請(qǐng)Token,并且python版本的Token是要付費(fèi)的,但沒(méi)有學(xué)過(guò)typescript,有點(diǎn)想放棄,瀏覽了一下ding-dong-bot的Example,似乎可以看懂,那就邊學(xué)習(xí)邊摸索吧。(ps:后來(lái)偶然見(jiàn)發(fā)現(xiàn)了另一篇可以使用將token轉(zhuǎn)變一下實(shí)現(xiàn)python版wechaty,但此時(shí)已經(jīng)基本用TS寫(xiě)完了,如果想用Python等其他語(yǔ)言可以參考[官方文檔](https://github.com/wechaty/wechaty/issues/1985)。)
## 具備功能
### 1. 關(guān)鍵詞觸發(fā)功能
1.1 關(guān)鍵詞"介紹一下自己"、 "自我介紹一下"、 "你是誰(shuí)"觸發(fā)自我介紹
1.2 地名+天氣 觸發(fā)天氣查詢
### 2. 智能聊天功能
2.1群外直接聊天
2.2群內(nèi)成員皆有聊天權(quán)限“@bot” 聊天
2.3不會(huì)回復(fù) @其他群成員 的消息
## 實(shí)現(xiàn)過(guò)程
Talk is cheap,show your code
### 1. 主程序
```typescript
import { Wechaty, Message, UrlLink,log,} from 'wechaty'
import { PuppetPadplus } from 'wechaty-puppet-padplus'
import { EventLogger, QRCodeTerminal } from 'wechaty-plugin-contrib'
import { WechatyWeixinOpenAI, } from 'wechaty-weixin-openai'
import { setSchedule, } from './schedule/index'
import { getDay, formatDate,} from './utils/index'
import { getOne, getTXweather, getSweetWord,} from './superagent/index'
// 創(chuàng)建微信每日說(shuō)定時(shí)任務(wù)
async function initDay() {
console.log(`已經(jīng)設(shè)定每日說(shuō)任務(wù)`);
setSchedule('0 40 0 * * *', async () => {
console.log('你的貼心小助理開(kāi)始工作啦!')
let logMsg
let contact =
(await bot.Contact.find({ name: 'Jason' })) ||
(await bot.Contact.find({ alias: 'boss' })) // 獲取你要發(fā)送的聯(lián)系人
let one = await getOne() //獲取每日一句
let weather = await getTXweather() //獲取天氣信息
let today = await formatDate(new Date()) //獲取今天的日期
let memorialDay = getDay('2009/08/07') //獲取紀(jì)念日天數(shù)
let sweetWord = await getSweetWord()
let str = `${today}\n我們相愛(ài)的第${memorialDay}天\n\n元?dú)鉂M滿的一天開(kāi)始啦,要開(kāi)心噢^_^\n\n今日天氣\n${weather.weatherTips}\n${
weather.todayWeather
}\n每日一句:<br>${one}<br><br>每日土味情話:<br>${sweetWord}<br><br>————————最愛(ài)你的我`
try {
logMsg = str
await delay(2000)
await contact.say(str) // 發(fā)送消息
} catch (e) {
logMsg = e.message
}
console.log(logMsg)
})
}
const padplusToken = '你自己的TOKEN'
const puppet = new PuppetPadplus({
token: padplusToken,
})
const bot = new Wechaty({
name: 'jason-assistant',
puppet,
})
bot.use(EventLogger())
bot.use(QRCodeTerminal({ small: true }))
//在Wechaty里面引用和配置插件
const openAIToken = '你自己的機(jī)器人TOKEN' //需要在微信對(duì)話開(kāi)放平臺(tái)申請(qǐng),點(diǎn)擊機(jī)器人設(shè)置》綁定應(yīng)用》在頁(yè)面最下方即可看到
const openAIEncodingAESKey = '你自己的EncodingAESKey' //微信對(duì)話開(kāi)放平臺(tái)申請(qǐng),點(diǎn)擊機(jī)器人設(shè)置》綁定應(yīng)用》在頁(yè)面最下方即可看到
const preAnswerHook = async (message: Message) => {
const isCommonMaterial = await processCommonMaterial(message)
if (isCommonMaterial) {
return false
}
}
/**
* 獲得boss聯(lián)系名片,當(dāng)機(jī)器人找不到問(wèn)題答案時(shí),將BOSS的名片推送過(guò)去
*/
const getBoss = async () => {
const contact = bot.Contact.load('boss微信ID')
await contact.sync()
return contact
}
const noAnswerHook = async (message: Message) => {
const room = message.room()
const from = message.from()
if (!room) {
const boss = await getBoss()
await message.say('你的問(wèn)題我不會(huì)回答,你可以聯(lián)系我的老板')
await message.say(boss)
return;
}
const members = await room.memberAll()
const bossInRoom = members.find(m => m.id === 'boss微信id')
if (bossInRoom) {
await room.say`${bossInRoom},${from}問(wèn)的問(wèn)題我不知道,你幫我回答一下吧。`
} else {
const boss = await getBoss()
await room.say`${from},你的問(wèn)題我不會(huì)回答,你可以聯(lián)系我的老板`
await room.say(boss)
}
}
/**
* 用wechaty-weixin-openai可以實(shí)現(xiàn)快速接入微信對(duì)話平臺(tái)
*/
bot.use(WechatyWeixinOpenAI({
token: openAIToken,
encodingAESKey: openAIEncodingAESKey,
noAnswerHook, //在機(jī)器人無(wú)法回答時(shí),推送設(shè)定的回答
preAnswerHook, //判斷是否是關(guān)鍵字,如果是關(guān)鍵字,觸發(fā)關(guān)鍵字回答而不接入微信開(kāi)放平臺(tái)
}))
const processCommonMaterial = async (message: Message) => {
const room = message.room()
// const from = message.from()
const mentionSelf = await message.mentionSelf()
const text = message.text()
let intro = 'Jason,愛(ài)好廣泛,廣交天下豪杰,上得了九天摘月,下得了五洋捉鱉,俗話說(shuō)的好,不會(huì)烘培的飛行員不是好戶外人,不會(huì)玩音樂(lè)的水族愛(ài)好者不是好廚師,不會(huì)畫(huà)畫(huà)的極限愛(ài)好者不是好程序員,這就是我的老板Jason,吼吼吼~~'
if (room !== null && mentionSelf) {
if (/jason|你老板|你上司/.test(text)) {
await room.say(intro)
await room.say(new UrlLink({
description: '戶外賤客 & Fighting,fighting,finghting and finghting,讀萬(wàn)卷書(shū),行萬(wàn)里路,學(xué)習(xí)AND吃,喝,玩,樂(lè)',
thumbnailUrl: '',
title: 'Jason',
url: 'http://mp.weixin.qq.com/s?__biz=MzkxODE3MjAyNQ==&mid=100000001&idx=1&sn=d05de320c6fbe6c9f9149a09a4da81ec&chksm=41b4391776c3b001c143ac2c284c58ac8b08de41d95cab682aa5a07022e32096567f5780d5be#rd',
}))
return true
} else if (/戶外賤客/.test(text)) {
await room.say(new UrlLink({
description: '戶外賤客 & Fighting,fighting,finghting and finghting,讀萬(wàn)卷書(shū),行萬(wàn)里路,學(xué)習(xí)AND吃,喝,玩,樂(lè)',
thumbnailUrl: '',
title: 'Jason',
url: 'http://mp.weixin.qq.com/s?__biz=MzkxODE3MjAyNQ==&mid=100000001&idx=1&sn=d05de320c6fbe6c9f9149a09a4da81ec&chksm=41b4391776c3b001c143ac2c284c58ac8b08de41d95cab682aa5a07022e32096567f5780d5be#rd',
}))
return true
}
}
return false
}
// 登錄
async function onLogin(user) {
console.log(`貼心小助理${user}登錄了`)
// 登陸后創(chuàng)建定時(shí)任務(wù)
await initDay()
}
bot.on('login', onLogin)
bot.start()
.then(() => log.info('StarterBot', 'Starter Bot Started.'))
.catch(e => log.error('StarterBot', e))
```
### 2.創(chuàng)建schedule定時(shí)函數(shù)
```typescript
import { schedule } from 'node-schedule'
// date 參數(shù)
//其他規(guī)則見(jiàn) https://www.npmjs.com/package/node-schedule
// 規(guī)則參數(shù)講解 *代表通配符
//
// * * * * * *
// ┬ ┬ ┬ ┬ ┬ ┬
// │ │ │ │ │ |
// │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
// │ │ │ │ └───── month (1 - 12)
// │ │ │ └────────── day of month (1 - 31)
// │ │ └─────────────── hour (0 - 23)
// │ └──────────────────── minute (0 - 59)
// └───────────────────────── second (0 - 59, OPTIONAL)
// 每分鐘的第30秒觸發(fā): '30 * * * * *'
//
// 每小時(shí)的1分30秒觸發(fā) :'30 1 * * * *'
//
// 每天的凌晨1點(diǎn)1分30秒觸發(fā) :'30 1 1 * * *'
//
// 每月的1日1點(diǎn)1分30秒觸發(fā) :'30 1 1 1 * *'
//
// 每周1的1點(diǎn)1分30秒觸發(fā) :'30 1 1 * * 1'
function setSchedule(date,callback) {
schedule.scheduleJob(date, callback)
}
export function setSchedule()
```
### 3.創(chuàng)建幾個(gè)功能函數(shù),爬取ONE網(wǎng)站的每日一句,提取通過(guò)API獲取的消息
```typescript
import * as cheerio from 'cheerio'
import * as superagent from 'superagent'
const ONE = 'http://wufazhuce.com/' // ONE的web版網(wǎng)站
const TXHOST = 'http://api.tianapi.com/txapi/' // 天行host
function req(url,method, params, data, cookies) {
return new Promise(function (resolve,reject) {
superagent(method, url)
.query(params)
.send(data)
.set('Content-Type','application/x-www-form-urlencoded')
.end(function (err, response) {
if (err) {
reject(err)
}
resolve(response)
})
})
}
async function getOne() {
// 獲取每日一句
try {
let res = await req(ONE, 'GET')
let $ = cheerio.load(res.text)
let todayOneList = $('#carousel-one .carousel-inner .item')
let todayOne = $(todayOneList[0])
.find('.fp-one-cita')
.text()
.replace(/(^\s*)|(\s*$)/g, '')
return todayOne
} catch (err) {
console.log('錯(cuò)誤', err)
return err
}
}
async function getTXweather() {
// 獲取天行天氣
let url = TXHOST + 'tianqi/'
try {
let res = await req(url, 'GET', {
key: '你自己的KEY',//需要自己去天行申請(qǐng),地址https://www.tianapi.com/signup.html?source=474284281
city: 'Arlington'
})
let content = JSON.parse(res.text)
if (content.code === 200) {
let todayInfo = content.newslist[0]
let obj = {
weatherTips: todayInfo.tips,
todayWeather:`阿林頓今天${todayInfo.weather}\n溫度:${todayInfo.lowest}/${todayInfo.highest}
\n${todayInfo.wind}風(fēng): ${todayInfo.windspeed}\n紫外線指數(shù):${todayInfo.uv_index}\n濕度
${todayInfo.humidity}`
};
console.log('獲取天行天氣成功', obj)
return obj
} else {
console.log('獲取接口失敗', content.code)
}
} catch (err) {
console.log('獲取接口失敗', err)
}
}
async function getSweetWord() {
// 獲取土味情話
let url = TXHOST + 'saylove/'
try {
let res = await req(url, 'GET', { key: '' })
let content = JSON.parse(res.text)
if (content.code === 200) {
let sweet = content.newslist[0].content
let str = sweet.replace('\r\n', '<br>')
return str
} else {
console.log('獲取接口失敗', content.msg)
}
} catch (err) {
console.log('獲取接口失敗', err)
}
}
export { getOne, getTXweather, getSweetWord, }
```
### 計(jì)算距離某日(生日,結(jié)婚紀(jì)念日等)還有多少天
```typescript
function getDay(date) {
var date2 = new Date()
var date1 = new Date(date)
var iDays = parseInt(
Math.abs(date2.getTime() - date1.getTime()) / 1000 / 60 / 60 / 24
)
return iDays
}
function formatDate(date) {
var tempDate = new Date(date)
var year = tempDate.getFullYear()
var month = tempDate.getMonth() + 1
var day = tempDate.getDate()
var hour = tempDate.getHours()
var min = tempDate.getMinutes()
var second = tempDate.getSeconds()
var week = tempDate.getDay()
var str = ''
if (week === 0) {
str = '星期日'
} else if (week === 1) {
str = '星期一'
} else if (week === 2) {
str = '星期二'
} else if (week === 3) {
str = '星期三'
} else if (week === 4) {
str = '星期四'
} else if (week === 5) {
str = '星期五'
} else if (week === 6) {
str = '星期六'
}
if (hour < 10) {
hour = '0' + hour
}
if (min < 10) {
min = '0' + min
}
if (second < 10) {
second = '0' + second
}
return year + '-' + month + '-' + day + '日 ' + hour + ':' + min + ' ' + str
}
export { getDay, formatDate }
```
![關(guān)鍵字觸發(fā)消息](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/keyword-push.png)
![無(wú)法回答推送名片](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/push-contact.png)
![定時(shí)推送消息](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/daily-message.png)
![智能聊天](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/talk-to-bot.png)
## 后記
到此已經(jīng)實(shí)現(xiàn)了私人人助理和定時(shí)推送消息的功能([項(xiàng)目地址](https://github.com/jasonlovesharon/my_bot)),由于對(duì)Typescript不熟,很多功能都是借鑒很多大神的輪子實(shí)現(xiàn)的,還是對(duì)Python熟悉點(diǎn),下步準(zhǔn)備用Python來(lái)實(shí)現(xiàn)以上功能,并進(jìn)一步拓展更多有趣的功能。
以上就是關(guān)于itchat怎么一直登錄相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
愛(ài)寫(xiě)作登錄官網(wǎng)(iwrite寫(xiě)作系統(tǒng)登錄學(xué)生官網(wǎng))
園林景觀設(shè)計(jì)revit(園林景觀設(shè)計(jì)效果圖)
如何快速提升網(wǎng)站關(guān)鍵詞排名(如何提高網(wǎng)站關(guān)鍵詞密度)