天天看點

python實作微信桌面分享小程式

主要功能:擷取網頁所有桌面儲存至伺服器,通過微信機器人每日定時分享給自己和好友,源碼及更多内容歡迎下載下傳https://github.com/oubahe/python-WallPaperShare

主要知識點:urllib解析網頁、python類和對象、re正規表達式、字典結構、bot機器人和圖檔檔案的讀寫

GetWallPaper:

import urllib

import requests

import re,time

import socket

class GetMitao(object):

def init(self):

self.ip = ‘http://www.mitozhi.com/’

self.wallpaper={}

def getHtmls(self):
    # 解析網頁
    ip = self.ip
    html = urllib.request.urlopen(ip).read()
    html = html.decode('utf-8')
    # 擷取欄目的内容清單
    content = '<li class="col-xs-2"><a class="text-overflow" href="/.*?>'
    hot_html = 'http://www.mitozhi.com/shoujibizhi/'
    reg = re.compile(content)
    selected = reg.findall(html)
    # print(selected) ## 列印所有的網頁位址測試
    blank = [elem.split('/')[-2] for elem in selected]
    # 擷取桌面網頁
    htmls = [];hot_end=100;end = 30
    # 添加其他類型桌面網頁
    for trans in blank:
        if trans == 'wenzikong':
            for i in range(1, end):
                wenzi = hot_html + trans + '/list_14_' + str(i) + '.html'
                # print(wenzi)
                htmls.append(wenzi)
        if trans == 'yijingfengge':
            for i in range(1, end):
                yijing = hot_html + trans + '/list_19_' + str(i) + '.html'
                # print(yijing)
                htmls.append(yijing)
        if trans == 'qinglvbizhi':
            for i in range(1, end):
                qinglv = hot_html + trans + '/list_18_' + str(i) + '.html'
                # print(qinglv)
                htmls.append(qinglv)
        if trans == 'gexinglinglei':
            for i in range(1, end):
                gexing = hot_html + trans + '/list_17_' + str(i) + '.html'
                # print(gexing)
                htmls.append(gexing)
        if trans == 'yingshimingxing':
            for i in range(1, end):
                mingxing = hot_html + trans + '/list_16_' + str(i) + '.html'
                # print(mingxing)
                htmls.append(mingxing)
        if trans == 'youxibizhi':
            for i in range(1, end):
                youxi = hot_html + trans + '/list_15_' + str(i) + '.html'
                # print(youxi)
                htmls.append(youxi)
        if trans == 'chongwubizhi':
            for i in range(1, end):
                chongwu = hot_html + trans + '/list_21_' + str(i) + '.html'
                # print(chongwu)
                htmls.append(chongwu)
        if trans == 'katong':
            for i in range(1, end):
                katong = hot_html + trans + '/list_13_' + str(i) + '.html'
                # print(katong)
                htmls.append(katong)
        if trans == 'suopingbizhi':
            for i in range(1, end):
                suoping = hot_html + trans + '/list_20_' + str(i) + '.html'
                # print(suoping)
                htmls.append(suoping)
        if trans == 'liaotianbeijing':
            for i in range(1, end):
                liaotian = hot_html + trans + '/list_26_' + str(i) + '.html'
                # print(liaotian)
                htmls.append(liaotian)
        if trans == 'meinvbizhi':
            for i in range(1, end):
                meinv = hot_html + trans + '/list_25_' + str(i) + '.html'
                # print(meinv)
                htmls.append(meinv)
    #添加熱門桌面類型的網址
    for i in range(1,hot_end+1):
        remen=hot_html + '/list_11_' + str(i) + '.html'
        htmls.append(remen)
    return htmls

# 擷取圖檔及圖檔名字儲存至字典
def getWallPaper(self):
    htmls=self.getHtmls()
    for url in htmls[:]:
        try:
            page = urllib.request.Request(url)
            NET_STATUS = False
            while not NET_STATUS:
                try:
                    # 擷取頁面的圖檔内容
                    html = urllib.request.urlopen(page,data=None,timeout=3).read()
                    html = html.decode('utf-8')
                    # 擷取圖檔及圖檔名字資訊
                    reg = '<img src="http://.*? class="'
                    img = re.compile(reg)
                    imglist = img.findall(html)
                    # 将圖檔及圖檔名字儲存為字典
                    for jpg in imglist:
                        # 圖檔位址
                        pos='http://.*?"'
                        pos=re.compile(pos)
                        jpg_pos=pos.findall(jpg)[0][:-1]
                        # 圖檔名字
                        patten='[\u4e00-\u9fa5]'
                        chinese=re.compile(patten)
                        chinese=''.join(chinese.findall(jpg))
                        name=''.join([str(ord(elem)) for elem in chinese])
                        # 存入字典
                        if name in list(self.wallpaper.keys()):
                            continue
                        else:
                            self.wallpaper[name]=jpg_pos
                        print('已抓取圖檔數:',len(list(self.wallpaper.keys())),name) ##列印擷取的圖檔名字進行測試
                        time.sleep(0.5)
                    break
                except socket.timeout:
                    NET_STATUS = False
        except:
            continue
    print('桌面采集完畢!')
    return self.wallpaper
           

SendWallPaper:

from wxpy import *

import time,datetime

import os,sys

import requests

from GetWallPaperAndSend.GetWallPaper import GetMitao

class SaveAndSendImg(object):

def init(self,path):

self.sended=[]

self.path=path

# 擷取圖檔位址響應
def getImgRequest(self,img):
    r = requests.get(img)
    return r

# 儲存圖檔至本地
def SaveImg(self):
    # 抓取圖檔并儲存至本地
    wallpaper = GetMitao().getWallPaper()
    files = os.listdir(self.path)
    # 将未儲存的圖檔儲存
    for img in list(wallpaper.keys()):
        jpg=img+'.jpg'
        if jpg not in files:
            img_pos = wallpaper[img]
            img = self.getImgRequest(img_pos)
            f = open(self.path + '\\' + jpg, 'wb')
            f.write(img.content)
            f.close()
            time.sleep(0.5)
    print('桌面儲存完畢!.')

def Send(self):
    while True:
        # 初始化緩存機器人登入
        bot = Bot(cache_path=True)
        # 擷取人物
        ying = bot.friends().search(u'萦')[0]
        zhuo = bot.friends().search(u'林')[0]
        bot.file_helper.send('桌面分享中...')
        # 擷取時間,到達時間點則分享
        hour=int(datetime.datetime.now().strftime('%H'))
        if hour==9:
            # 擷取新圖檔并儲存
            self.SaveImg()
            # 記錄桌面張數
            pic_number=0
            # 擷取檔案夾所有圖檔
            files = sorted(os.listdir(self.path))
            # 發送今日份資訊
            ying.send('今日份桌面送到啦!')
            bot.file_helper.send('今日份桌面送到啦!')
            zhuo.send('今日份桌面送到啦!')
            # 發送圖檔
            for name in files:
                img = self.path+'\\'+name
                # 将圖檔名字數字字元轉化為文字名字
                params = name.split('.')[0]
                img_name=''
                while params:
                    word = params[:5]
                    img_name += chr(int(word))
                    params = params[5:]
                    if len(params) == 5:
                        break
                img_name+=chr(int(params))
                img_name = 'WallPaperName:'+img_name
                try:
                    if name not in self.sended:
                        print('開始分享第%d張桌面'%(pic_number+1))
                        # 微信發送桌面
                        ying.send(img_name)
                        ying.send_image(img)
                        #
                        bot.file_helper.send(img_name)
                        bot.file_helper.send_image(img)
                        #
                        zhuo.send(img_name)
                        zhuo.send_image(img)
                        # 儲存已發送的桌面
                        self.sended.append(name)
                        # 記錄桌面張數
                        pic_number+=1
                    else:
                        continue
                    # 每日推送3張後退出等待
                    if pic_number==3:
                        break
                    time.sleep(3)
                except ResponseError as e:
                    print('桌面發送出現問題:',e.err_code,e.err_msg)
                    sys.exit()
            print('->等待明日桌面分享...')
        time.sleep(3600)
           

if name==‘main’:

# 桌面抓取、存儲與定時分享

SaveAndSendImg(r’G:\WallPaper’).Send()

微信實時測試分享效果:

python實作微信桌面分享小程式