每天叫醒你的不是鬧鐘,而是“愛詞霸每日一句”——Python實現將每日一句定時推送至微信

来源:https://www.cnblogs.com/connect/archive/2018/08/02/python-wechat-iciba.html
-Advertisement-
Play Games

基於微信公眾平臺測試號開發一個定時給用戶發送“每日一句”功能的程式。每日一句的數據源調用“愛詞霸每日一句”的API,內容包含英文及釋義還有小編的解讀。發送的微信消息使用微信公眾號的模板消息。定時功能是利用Linux的crontab實現的。 ...


前言

前幾天在網上看到一篇文章《教你用微信每天給女票說晚安》,感覺很神奇的樣子,隨後研究了一下,構思的確是巧妙。好,那就開始動工吧!伺服器有了,Python環境有了,IDE打開了...然而...然而...我意識到了一個非常嚴重的問題...沒有女朋友 (T_T)...

微信開發已經活躍了很長時間了,在微信開發中有一個神奇的介面它叫模板消息介面,它可以根據用戶的openid從服務端給用戶推送自定義的模板消息,正因如此,我們可以利用這個特征在伺服器端隨時向用戶推送消息(前提是該用戶關註了該公眾號)。

總結出3點,1.模板消息的格式可以自定義,2.模板消息的內容可以自定義,3.模板消息發送的時間可以自定義。那麼我們可以利用這些性質為自己做一款說早安的程式啦!

實驗環境

  1. 阿裡雲Linux伺服器
  2. Python環境

愛詞霸每日一句API介紹

調用地址:http://open.iciba.com/dsapi/
請求方式:GET
請求參數:

參數 必選 類型 說明
date string 格式為:2013-05-06;如果date為,則預設取當天
type string 可選值為lastnext;以date日期為準的,last返回前一天的,next返回後一天的

返回類型:JSON
JSON欄位解釋:

屬性名 屬性值類型 說明
sid string 每日一句ID
tts string 音頻地址
content string 英文內容
note string 中文內容
love string 每日一句喜歡個數
translation string 詞霸小編
picture string 圖片地址
picture2 string 大圖片地址
caption string 標題
dateline string 時間
s_pv string 瀏覽數
sp_pv string 語音評測瀏覽數
tags array 相關標簽
fenxiang_img string 合成圖片,建議分享微博用的

正常返回示例:

{
  "sid": "3080",
  "tts": "http://news.iciba.com/admin/tts/2018-08-01-day.mp3",
  "content": "No matter how hard we try to be mature, we will always be a kid when we all get hurt and cry. ",
  "note": "不管多努力蛻變成熟,一旦受傷哭泣時,我們還是像個孩子。",
  "love": "1966",
  "translation": "小編的話:這句話出自小說《彼得·潘》。歲月永遠年輕,我們慢慢老去。不管你如何蛻變,最後你會發現:童心未泯,是一件值得驕傲的事情。長大有時很簡單,但凡事都能抱著一顆童心去快樂享受卻未必容易。",
  "picture": "http://cdn.iciba.com/news/word/20180801.jpg",
  "picture2": "http://cdn.iciba.com/news/word/big_20180801b.jpg",
  "caption": "詞霸每日一句",
  "dateline": "2018-08-01",
  "s_pv": "0",
  "sp_pv": "0",
  "tags": [
    {
      "id": null,
      "name": null
    }
  ],
  "fenxiang_img": "http://cdn.iciba.com/web/news/longweibo/imag/2018-08-01.jpg"
}

請求示例:

Python2請求示例

#!/usr/bin/python2
#coding=utf-8
import json
import urllib2
def get_iciba_everyday():
  url = 'http://open.iciba.com/dsapi/'
  request = urllib2.Request(url)
  response = urllib2.urlopen(request)
  json_data = response.read()
  data = json.loads(json_data)
  return data
print get_iciba_everybody()

Python3請求示例

#!/usr/bin/python3
#coding=utf-8
import json
import requests
def get_iciba_everyday():
    url = 'http://open.iciba.com/dsapi/'
    r = requests.get(url)
    return json.loads(r.text)
print(get_iciba_everyday())

PHP請求示例

<?php
function https_request($url, $data = null){
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_HEADER, 0);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  if (!empty($data)) {
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  }
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($curl);
  curl_close($curl);
  return $output;
}
function get_iciba_everyday(){
  $url = 'http://open.iciba.com/dsapi/'
  $result = https_request($url);
  $data = json_decode($result);
  return $data;
}
echo get_iciba_everyday();

本介面(每日一句)官方文檔:http://open.iciba.com/?c=wiki
參考資料:金山詞霸 · 開發平臺

登錄微信公眾平臺介面測試賬號

掃描登錄公眾平臺測試號
申請測試號的地址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

手機上確認登錄

找到新增測試模板,添加模板消息

填寫模板標題每日一句,填寫如下模板內容

{{content.DATA}}

{{note.DATA}}

{{translation.DATA}}

提交保存之後,記住該模板ID,一會兒會用到

找到測試號信息,記住appidappsecret,一會兒會用到

找到測試號二維碼。手機掃描此二維碼,關註之後,你的昵稱會出現在右側列表裡,記住該微信號,一會兒會用到(註:此微信號非你真實的微信號)

發送微信模板消息的程式

本程式您只需要修改4個地方即可,請看註釋

Python2實現

#!/usr/bin/python2
#coding=utf-8
import json
import urllib2

class iciba:
    # 初始化
    def __init__(self, wechat_config):
        self.appid = wechat_config['appid']
        self.appsecret = wechat_config['appsecret']
        self.template_id = wechat_config['template_id']
        self.access_token = ''

    # 獲取access_token
    def get_access_token(self, appid, appsecret):
        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (appid, appsecret)
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        json_data = response.read()
        data = json.loads(json_data)
        access_token = data['access_token']
        self.access_token = access_token
        return self.access_token

    # 發送消息
    def send_msg(self, openid, template_id, iciba_everyday):
        msg = {
            'touser': openid,
            'template_id': template_id,
            'url': iciba_everyday['fenxiang_img'],
            'data': {
                'content': {
                    'value': iciba_everyday['content'],
                    'color': '#0000CD'
                    },
                'note': {
                    'value': iciba_everyday['note'],
                },
                'translation': {
                    'value': iciba_everyday['translation'],
                }
            }
        }
        json_data = json.dumps(msg)
        if self.access_token == '':
            self.get_access_token(self.appid, self.appsecret)
        access_token = self.access_token
        url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s' % str(access_token)
        request = urllib2.Request(url, data=json_data)
        response = urllib2.urlopen(request)
        result = response.read()
        return json.loads(result)

    # 獲取愛詞霸每日一句
    def get_iciba_everyday(self):
        url = 'http://open.iciba.com/dsapi/'
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        json_data = response.read()
        data = json.loads(json_data)
        return data

    # 為設置的用戶列表發送消息
    def send_everyday_words(self, openids):
        everyday_words = self.get_iciba_everyday()
        for openid in openids:
            result = self.send_msg(openid, self.template_id, everyday_words)
            if result['errcode'] == 0:
                print ' [INFO] send to %s is success' % openid
            else:
                print ' [ERROR] send to %s is error' % openid

    # 執行
    def run(self, openids):
        self.send_everyday_words(openids)


if __name__ == '__main__':
    # 微信配置
    wechat_config = {
        'appid': 'xxxxxx', #此處填寫你的appid
        'appsecret': 'xxxxxxx', #此處填寫你的appsecret
        'template_id': 'xxxxx' #此處填寫你的模板消息ID
    }
    # 用戶列表
    openids = [
        'xxxxx', #此處填寫你的微信號(微信公眾平臺上你的微信號)
        #'xxxx', #如果有多個用戶也可以
                #'xxxx',
    ]
    # 執行
    icb = iciba(wechat_config)
    icb.run(openids)

Python3實現

#!/usr/bin/python3
#coding=utf-8
import json
import requests

class iciba:
    # 初始化
    def __init__(self, wechat_config):
        self.appid = wechat_config['appid']
        self.appsecret = wechat_config['appsecret']
        self.template_id = wechat_config['template_id']
        self.access_token = ''

    # 獲取access_token
    def get_access_token(self, appid, appsecret):
        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (str(appid), str(appsecret))
        r = requests.get(url)
        data = json.loads(r.text)
        access_token = data['access_token']
        self.access_token = access_token
        return self.access_token

    # 發送消息
    def send_msg(self, openid, template_id, iciba_everyday):
        msg = {
            'touser': openid,
            'template_id': template_id,
            'url': iciba_everyday['fenxiang_img'],
            'data': {
                'content': {
                    'value': iciba_everyday['content'],
                    'color': '#0000CD'
                    },
                'note': {
                    'value': iciba_everyday['note'],
                },
                'translation': {
                    'value': iciba_everyday['translation'],
                }
            }
        }
        json_data = json.dumps(msg)
        if self.access_token == '':
            self.get_access_token(self.appid, self.appsecret)
        access_token = self.access_token
        url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s' % str(access_token)
        r = requests.post(url, json_data)
        return json.loads(r.text)

    # 獲取愛詞霸每日一句
    def get_iciba_everyday(self):
        url = 'http://open.iciba.com/dsapi/'
        r = requests.get(url)
        return json.loads(r.text)

    # 為設置的用戶列表發送消息
    def send_everyday_words(self, openids):
        everyday_words = self.get_iciba_everyday()
        for openid in openids:
            result = self.send_msg(openid, self.template_id, everyday_words)
            if result['errcode'] == 0:
                print (' [INFO] send to %s is success' % openid)
            else:
                print (' [ERROR] send to %s is error' % openid)

    # 執行
    def run(self, openids):
        self.send_everyday_words(openids)


if __name__ == '__main__':
    # 微信配置
    wechat_config = {
        'appid': 'xxxxx', #此處填寫你的appid
        'appsecret': 'xxxxx', #此處填寫你的appsecret
        'template_id': 'xxxxx' #此處填寫你的模板消息ID
    }
    # 用戶列表
    openids = [
        'xxxxx', #此處填寫你的微信號(微信公眾平臺上你的微信號)
        #'xxxx', #如果有多個用戶也可以
        #'xxxx',
    ]
    # 執行
    icb = iciba(wechat_config)
    icb.run(openids)

測試程式

在Linux上執行程式

在手機上查看,已經收到了每日一句的消息

部署程式

在Linux上設置定時任務

crontab -e

添加如下內容

0 6 * * *    python /root/python/iciba/main-v1.0.py

註:以上內容的含義是,在每天6:00的時候,執行這個Python程式
查看定時任務是否設置成功

crontab -l

至此,程式部署完成,請您明天6:00查收吧!
效果圖如下


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為我喜歡打 王者榮耀,我就打開了 王者榮耀的標題 系統把 主播房間的 鏈接放在一個li 元素內的,而data-rid 則對應 房間的ID,我們可以根據 房間id,刪除這些li元素,從而過濾我們不喜歡的主播 我們先 創建一個 removeRoom的分支 然後開始寫代碼 應當註意的是擴展 conten ...
  • 問題引出 新產品的體系架構包含多個模塊,模塊集特點是數量多、模塊間交互複雜。那麼統一介面是一個很好的解決方案,為了實現統一介面打算採用微服務的核心思想,設計了採用restful service的數據交互方式技術架構。這裡記錄一下kafka資源訪問的服務化搭建,後續記錄api和實戰。 解決方案 res ...
  • 一、簡介 RESTEasy是JBoss的一個開源項目,提供各種框架幫助你構建RESTful Web Services和RESTful Java應用程式。它是JAX-RS規範的一個完整實現並通過JCP認證。作為一個JBOSS的項目,它當然能和JBOSS應用伺服器很好地集成在一起。但是,它也能在任何運行 ...
  • 一.最常用通過 Arrays.asList(strArray) 方式,將數組轉換List後,不能對List增刪,只能查改,否則拋異常。 關鍵代碼: 例子: 執行報錯: 報錯原因: 上面程式在list.add(“1”)處拋出異常:UnsupportedOperationException。這是因為Ar ...
  • 前言 只有光頭才能變強 之前在刷博客的時候,發現一些寫得比較好的博客都會默默收藏起來。最近在查閱補漏,有的知識點比較重要的,但是在之前的博客中還沒有寫到,於是趁著閑整理一下。 文本的知識點: Integer常量池 TCP拆包粘包 簡單區別 jdk1.6以後對Synchronize鎖優化 Java記憶體 ...
  • 線程 Thread 進程: 正在進行的程式 一個進程中至少有一個線程 進程是系統進行資源分配和調用的獨立單位,每一個進程都有它自己的記憶體空間和系統資源 多進程:可以同時乾很多事情,但不是同時進行,而是在程式間高效切換。 線程:在同一個進程中可以執行多個任務,而每一個任務,就是一個線程,是程式的執行單 ...
  • 今年7月底,JDK11已經進入了Rampdown Phase Two階段,這標志著該版本所有特性已經被凍結,不會有新的JEP會加入版本中。 這一階段將會修複P1–P2級BUG,之後,JDK11預定於今年9月25日發佈。確定發佈的17個JEP如下,其中包括14個新特性以及3個移除的功能: 181: N ...
  • Object類:所有類的超類 Object類是Java中所有類的始祖,在Java中每個類都是由它擴展而來的。但是並不需要這樣寫: 如果沒有明確的指出超類,Object就被認為是這個類的超類。在Java中,只有基本數據類型不是對象,所有數組類型,不管是對象數組還是基本類型的數組都擴展(繼承)了Obje ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...