飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8727|回复: 0

女朋友让我深夜十二点催她睡觉,我有Python我就不干

[复制链接]

6389

主题

6477

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21491
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
4 l& H% X+ `, I$ [9 p/ B4 I
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>; G! F4 g& \2 A) ~  P- P! k) Y
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>! ~" k! o' ]# R: ~7 c
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
9 C1 o1 r1 A7 _; {<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>- z! Z( y! l5 c+ v3 f- ~
但,女朋友的命令,我是不敢违抗的……<br>
' Q' m9 G' v7 y! a) I& N2 W# ?<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>* S* N$ M$ z9 h4 s1 e% h( [
但是睡觉也不能缺!</p>  l" b4 [; z; g: m; E* d8 _' {+ J
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>. `2 J) F! G; [' I
<h1 id="python登场">Python登场</h1>9 p- S2 e- ], [4 L. J
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>* m* ~* c# |  w' i5 \) P! U
<h2 id="安装和导入">安装和导入</h2>9 R0 K  L) X- l
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>9 K. z8 @8 q) c& c- X* B
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
, o, _4 K- ]) n- \<pre><code class="language-p">pip install apscheduler
  s$ ?% F7 w6 J" dpip install pyautogui: y2 D. }2 z0 X# @2 ^- p; S
</code></pre>
( g" d# g2 ~4 A& s0 J<p>导入:</p>/ g0 \  s9 t( z( E0 U
<pre><code class="language-python">import pyautogui
4 d& D! P1 m* y& X3 _from datetime import datetime
1 e# S9 @8 z2 Zfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
: Y9 T; ~9 c' `/ h" w2 P- A9 |# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
" i( C8 \  p. E; v9 i# from apscheduler.schedulers.background import BackgroundScheduler8 U+ [& w1 I/ i7 N. T- S
</code></pre>* u$ u+ |; b1 R4 l/ m, s
<h1 id="pyautogui">pyautogui</h1>
8 `3 D; L# z" n' G<p>首先我们来实现自动发送消息</p>
- I3 S- z3 X% f# V2 ?$ S, |0 Y<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>2 ~. B& v4 z6 N7 E- U( ~
<p>先来做一些基本设置:</p>. r: x. Y" Y5 D: t: s' p( D1 u% q
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快* @" E, m. ^( _# c
</code></pre>
& {: f! N& O0 L. I0 D<p>然后我们登录微信,最小化。</p>5 F9 F5 K& a. ?5 W: @  f
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>) [+ t; `! F+ {1 R5 g+ R
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
7 v; K( V3 l- n8 B2 U9 j$ iicon_position = pyautogui.position() # Point(x=148, y=879)" Q& e5 M1 [! {% {7 P
</code></pre>9 L2 E/ C: Z# k* }6 w  Z
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>, N2 U( h8 _" }
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>9 Q/ Z6 g! C9 L* s2 z6 j: P  \/ ?
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
, `; O2 F, O, {2 M, sentry_position = pyautogui.position() # Point(x=174, y=751)8 {6 j& f& d9 F7 b9 @5 D6 _$ \
</code></pre>6 a( H9 w' M& I7 i2 e* x
<p>接下来,控制程序依次点击这两个点:</p>
7 p! m' ?! L2 d8 D# G& w<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
. I3 y: F& T6 F" d4 L( w: l* k# pyautogui.click(148, 879)
! ~  P6 T" T; A+ b+ h% t" Dpyautogui.click(entry_position)* s9 h' r' @: W* i1 J& Y9 U
# pyautogui.click(174, 751)& z* r  k0 s& b  q7 o- @
</code></pre>  m) o! d# p" y1 W3 t5 r/ N
<p>打开微信并锁定焦点后,我们开始输入文本。</p># M) q( ?) @+ p% x- {5 ?
<p>输入文本可以有两种方式:</p>
& }( M, K4 a8 Z# ~" m3 L) y<ul>5 E! r  K1 b6 w
<li>" Y5 t* }3 T+ ]; y! u
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>2 P) F+ O2 g1 _6 ]; d& ^
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>( D* l3 e" Q1 k; s
</li>
1 {' j) o+ p7 C( N<li>0 T& E; C( ^- S- b$ ~
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
9 e5 n3 I$ I" V1 e6 g<p>传入字符串,但不能同时打印字母和特殊按键。</p>
8 k# G  U$ {5 \: ?" Z</li>
+ r: J3 M7 B- I- u! c' W4 U</ul>6 \7 _( @) F4 m/ ~  L
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>  b7 t2 A( g" d( k1 g5 k2 b
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间# C- A/ P; |. u0 K
</code></pre>7 J1 R% b1 Q9 |! u! P9 j" H' A" I
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
/ H' V# f" v- ]; H+ N<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选( Y% G; s, N  Y& D$ G
pyautogui.click(icon_position)* y7 d% F  z8 r, W  ~8 L7 S) n
pyautogui.moveTo(entry_position, duration=2)
5 Z6 t; M7 j" g. \1 Spyautogui.click(entry_position)
3 o+ {0 ^' i. H) U4 _* W, [pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选& `3 `7 s9 r6 y. V) r
</code></pre>5 L3 Y3 y: a+ Y2 |) e# `
<p>看看效果:<br>
9 T, c4 q/ D+ d, H' R1 Y4 \1 w  l<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
! u# L2 @( \2 [' V. v当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>% \, b% D, \1 c6 K/ ?+ W
<pre><code class="language-python">import pyperclip2 E) A4 X# k$ D7 w3 }/ e4 O
" W- d& v5 }: g6 Q$ t; n' q) o% z
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制) K- {  d* ]- ~- H% V
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
$ m8 f  x  u3 a: ^6 H* ~2 }pyautogui.press('enter') # 按下按键
: [% H+ g0 A+ W</code></pre>
! I' c) q# t/ F5 l# t<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
" \5 O* o- c) H9 s这样,我们便完成了自动发送微信消息的功能了。</p>
4 ^; N! A+ o* q4 o' r<h1 id="apscheduler">apscheduler</h1>- `8 S3 [) C* \7 e1 r
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
& h4 Q, Q, n, q' ]+ ^% F* h. V4 H<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
5 O2 ]( @. K) G4 @scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
! ?9 D% Y, I3 B5 ~% v, j. Y( tscheduler.start()& R! Y4 O3 u$ i
</code></pre>4 U% E0 N; V, w! v( x3 y
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>
+ B" x5 M. `# h9 }6 s2 k<h1 id="完整代码">完整代码</h1>
2 i& n6 n% A2 p/ \0 h! v<pre><code class="language-python">import pyautogui: I8 B! V: k& v
import pyperclip
- f  o, |0 u6 Z! K4 F' {from datetime import datetime- A( Q1 o5 t% B
from apscheduler.schedulers.blocking import BlockingScheduler
. t7 W: k0 O, P% g& Q3 s, B, a# T  L% X
def main():, M, G5 e# O0 R% q% k
        pyautogui.PAUSE = 0% `# P) Q3 v  m( f. ?
( P7 o# l& }1 n1 z
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置( J. Z" C! y% j+ i
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置( J$ x4 Y2 w! u: ]: ~1 r- X
" i( Z) K/ N3 _7 ~+ [+ a$ j1 }" F
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
/ n* z! z' U; z# O% @        pyautogui.click(icon_position)) T3 A- x6 u! F- ]
        pyautogui.moveTo(entry_position, duration=0.7)
% i, }8 G/ S' h% A  K! {        pyautogui.click(entry_position)
% o8 T! B, ]5 f: A        pyperclip.copy('快去睡觉')" l( V" F+ f; k2 `  s, G6 g2 ?
        pyautogui.hotkey('ctrl', 'v')( Z5 S  W! G9 D# A5 {$ V: o0 z# x
        pyautogui.press('enter')( J# @  |8 U- w  i4 W" N+ z5 p
    pyperclip.copy('笨猪')
* h# q8 y/ S# \# _; ?        pyautogui.hotkey('ctrl', 'v')
$ G% F' D, d- k0 T2 n3 A5 H- O        pyautogui.press('enter')% o) j# K* W  v! F' Y& O' K
   
* F: s0 K- y* r3 b; _scheduler = BlockingScheduler() # 实例化! s: u4 r& P( R9 E* F+ k
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
6 i( P9 S' e6 p3 @2 F6 nscheduler.start()1 z" @  g% e6 F3 t. p
</code></pre>
1 F7 L. X) Y5 s' A! ^$ R- `- s4 c<p>完成啦!现在可以去睡觉了。</p>2 i5 e! y' t( Q3 ^6 y4 k6 i
<h1 id="结果">结果</h1>
+ Z7 w# R0 B. G  Y3 n<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>7 ]1 ~! N) }- i  k0 C
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>) f2 j  w7 p# P" V' r
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>. P3 Q1 N) t5 L6 Y" R( a
<hr>
& E1 o: X2 p9 ?+ Q<h1 id="---the-end---">-- the End --</h1>. `$ d9 H2 H0 ]$ k# @, Z
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
6 g' |, \; e5 S' l<p>打个小广告:作者CSDN博客主页:<br>; o  o$ m9 G4 a1 m( W/ p; ^$ _7 `
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>9 _! N) I3 b! Y, N6 |7 X+ q

7 R% T' _) R+ _% L
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2025-4-21 08:40 , Processed in 0.129848 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表