不要給我發土味情話啦!🐷

不要天天給我說土味情話啦!

過年時要跟女朋友分開一周,因為疫情,2021春節沒有回家,這次還是第一次分開這麼久,要怎麼表達我的思念呢?image-20220221212911127過年回家女朋友還把電腦拿回去工作,那就怪不得我了。image-20220221213529991我要天天發情話郵件騷擾你~

API調用

首先,找到API調用的介面,這裡用的是土味情話API介面 – 天行數據TianAPI

image-20220221213809063

土味情話返回示例

{
  "code": 200,
  "msg": "success",
  "newslist": [
    {
      "content": "你有打火機嗎?沒有啊,那你是怎麼點燃我的心的?"
    }
  ]
}

Python程式碼

開始用requests寫介面請求,這裡創建TIANXING_API作為父類,調用介面的使用直接繼承這個父類就可以了,裡面定義了一個get_content方法,如果只是單純的返回如「土味情話」這段話,那就可以直接繼承父類的get_content方法,如果有介面返回更多的資訊,重寫這個方法就行。

如全網熱搜榜API:

{
  "code": 200,
  "msg": "success",
  "newslist": [
    {
      "title": "浙江新增本土確診44例",
      "hotnum": 3491764,
      "digest": "12月13日0-24時,浙江新增確診病例45例,其中杭州市2例、寧波市4例、紹興市38例、境外輸入1例(剛果金輸入)。"
    }
  ]
}

另外,由於請求參數中有的只需傳如api_key即可,有的介面還需要指定參數,因此,__init__介面時以字典的形式傳入相關參數即可。如天氣API:

{
  "code": 200,
  "msg": "success",
  "newslist": [
    {
      "area": "上海市",
      "date": "2020-03-23",
      "week": "星期二",
      "weather": "晴轉多雲",
      "weatherimg": "yun.png",
      "real": "18℃",
		.....
    }
  ]
}

api_base.py程式碼如下:

注意:由於是部署在Linux上,所以在開頭指定了調用的python解釋器的路徑

#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests


class TIANXING_API(object):

    def __init__(self):
        self.api_url = '//api.tianapi.com'
        self.api_key = {'key': '71243da018e621f49178d6eab11d1ce9'}
        self.data = {}
        self.data.update(self.api_key)
        self.url = ''

    def get_content(self):
        r = requests.get(self.url, params=self.data)
        rj = r.json()
        return rj['newslist'][0]['content']


class Zaoan(TIANXING_API):

    def __init__(self, data=None):
        TIANXING_API.__init__(self)
        self.path = '/zaoan/index'
        self.url = self.api_url + self.path
        if data:
            self.data.update(data)
    # def get_content(self):
    	# pass


class Saylove(TIANXING_API):

    def __init__(self, data=None):
        TIANXING_API.__init__(self)
        self.path = '/saylove/index'
        self.url = self.api_url + self.path
        if data:
            self.data.update(data)
            
   # def get_content(self):
    	# pass


發送郵件

新建mail_base.py,使用smtplib和email這兩個庫,定義了一個MailSender類作為管理員對象,這裡寫的很差,應該重新定義一個Message類,當時只是因為一時心血來潮,寫的時候比較倉促,後面也沒啥繼續擴展的想法了,就沒有重新修改。


import smtplib
from email.header import Header
from email.mime.text import MIMEText


# 設置伺服器所需資訊
# 163郵箱伺服器地址

class MailSender(object):

    def __init__(self,receivers={}):
        self.mail_host = 'smtp.qq.com'
        self.mail_user = '[email protected]'
        self.mail_pass = 'xxxxxxx'
        self.sender = '[email protected]'
        self.receivers_dict = {}
        self.receivers_dict.update(receivers)
        self.receivers = [i for i in self.receivers_dict.values()]
        self.sign = {'xin': '\n\n愛你的飛飛', 'others': '\n\nYIFEI ZHANG'}
        self.mail_header = {'xin': 'Baby:\n\n\t', 'others': 'Hi:\n\n\t'}

    def init_smtp(self):

        self._smtpObj = smtplib.SMTP()
        try:
            # 連接伺服器
            self.smtpObj.connect(self.mail_host, 25)

        except smtplib.SMTPException as e:
            print ('error', e)

    @property
    def smtpObj(self):
        if not hasattr(self, '_smtpObj'):
            self.init_smtp()
            return self._smtpObj
        else:
            return self._smtpObj

    def _set_subject(self, subject=None):
        if not subject:
            self.message['Subject'] = 'Title'
        else:
            self.message['Subject'] = Header(subject, 'utf-8')

    def _set_from(self, mfrom=None):
        if not mfrom:
            self.message['From'] = self.sender
        else:
            self.message['From'] = mfrom

    def _set_to(self, mto=None, rev=0):
        if not mto:
            self.message['To'] = ''
            for i in self.receivers:
                self.message['To'] += i + ','
            self.message['To'].rstrip(',')
        else:
            self.message['To'] = mto

    def _set_message(self, text='', subject=None, mfrom=None, mto=None):
        try:
            self.message = MIMEText(text, 'plain', 'utf-8')
            self._set_subject(subject=subject)
            self._set_to(mto=mto)
            self._set_from(mfrom=mfrom)

        except Exception:
            print (Exception)

    def send(self, text='', subject=None, mfrom=None, mto=None):

        try:
            self._set_message(text=text, subject=subject, mfrom=mfrom, mto=mto)
            self.smtpObj.login(self.mail_user, self.mail_pass)
            self.smtpObj.sendmail(
                self.sender, self.receivers, self.message.as_string())
            self.smtpObj.quit()
            print('successful.')
        except smtplib.SMTPException as e:
            print ('error', e)

然後,在main.py中對基類進行實例化和調用方法即可。定義了一個收件人列表,早上八點給女朋友和我自己發早安心語,晚上九點給女朋友發土味情話

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time

import apibase
from mailbase import MailSender

MAIL_RECEIVERS = {
    'yifei': '[email protected]',
    'myself_qq': '[email protected]',
    'jiaxin': '[email protected]'
}

now_localtime = time.strftime("%H:%M:%S", time.localtime())
if "08:00:00" < now_localtime < "09:00:00":
    ms = MailSender(MAIL_RECEIVERS)
    ms.send(text=ms.mail_header['xin'] + apibase.Zaoan().get_content() + ms.sign['xin'], subject='早安心語')
elif "21:00:00" < now_localtime < "23:00:00":
    del MAIL_RECEIVERS['yifei']
    ms = MailSender(MAIL_RECEIVERS)
    ms.send(text=ms.mail_header['xin']+ apibase.Saylove().get_content() +ms.sign['xin'], subject='悄悄話')

然後在我買的Linux伺服器中使用crontab定時執行該腳本。

Linux中也需要對郵件相應的服務進行部署,在這裡就不展開了,度娘Google啥都有。

zyf@VM-8-17-ubuntu:~/MailRegular$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
1 8,21 * * * python /home/zyf/MailRegular/main.py

看了一下發件箱,已經發了這麼多封土味情話了image-20220221222812030

image-20220221222526027

今天發的:

image-20220221223110386

確實夠土味🤣怪不得不讓我發了哈哈哈。

image-20220221223228961

Tags: