飞雪团队

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

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

[复制链接]

6806

主题

6894

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22748
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式

0 `0 i6 e# H/ c+ P8 B& o<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>! w9 Y' c. h- L
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>6 q" s9 q% V' f; q
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>1 d$ E3 {* m* B+ P6 C
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
' M% ?0 @5 Z0 U1 T$ w但,女朋友的命令,我是不敢违抗的……<br>
' o9 }1 j- }, U6 x<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>' u9 F8 F3 m# |4 D' ~  z
但是睡觉也不能缺!</p>8 d$ m& |. T: V3 t. W+ l
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>" _7 U) k  ?  ]$ |' Y. a7 m& k2 t
<h1 id="python登场">Python登场</h1>8 \4 ]1 D* `# ^7 C7 Y1 v
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>) k# Z9 L! T) U
<h2 id="安装和导入">安装和导入</h2>
. e: ^6 j1 R5 E' ]; }! i<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p># y1 q' i/ ^# @1 ?# k
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
' _5 d. H: Y* [$ U# c<pre><code class="language-p">pip install apscheduler- u- }4 X9 T( p' E
pip install pyautogui
  c) }( t. ^0 t* D2 m</code></pre>  R$ r* C+ U- A) O6 A
<p>导入:</p>. A) Q+ V' O( k
<pre><code class="language-python">import pyautogui
: u9 p5 _) i6 b; o/ w: J# xfrom datetime import datetime3 h; r5 }: o% g5 O
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
5 s+ d1 v7 Z  C, ?! z$ }) ^# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
" V6 m( U( E2 _6 `/ K+ S# from apscheduler.schedulers.background import BackgroundScheduler
5 Z5 M6 M/ B6 _" b; u+ l7 h; n; v</code></pre># f1 k$ z. R8 u4 |) Q4 G/ c( `" j
<h1 id="pyautogui">pyautogui</h1>6 p. c8 D% @9 |( W" g
<p>首先我们来实现自动发送消息</p>
1 S- C$ p" q3 f4 J+ J; {, p<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>" \( u7 C% c  }9 L
<p>先来做一些基本设置:</p>, E) ^5 ]$ P. I1 E
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快2 d: c2 n( k0 e2 Q5 |
</code></pre>* B& J1 V- Q0 g- v( f
<p>然后我们登录微信,最小化。</p>
8 M0 ^* m" O/ X* o<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
2 ?% A+ `0 h7 Q0 w4 A1 J1 _4 V% [<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)2 N8 H3 G  C' C2 j$ b- W+ i
icon_position = pyautogui.position() # Point(x=148, y=879)
6 d3 }8 Q2 d- G# U& e# Y  q# w</code></pre>3 M% l0 @3 W. q) H0 k( b+ U* C
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>) f, b7 q& s+ l/ b0 c# D
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>0 z/ n( \1 W- l! H# N  A4 l7 P
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
) {/ d3 K7 v' i4 t/ N& Fentry_position = pyautogui.position() # Point(x=174, y=751)
5 R+ d8 d# ?0 L5 V' l; R/ K+ x</code></pre>) R- C) N" D$ ], N* `  Y0 R$ T, R( i
<p>接下来,控制程序依次点击这两个点:</p>
$ W; _, x0 b$ F. }<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
2 T9 S0 c8 j- N% D& W' g# pyautogui.click(148, 879), d3 t. E1 c5 D
pyautogui.click(entry_position)
) s' {6 E( j0 c! y# pyautogui.click(174, 751)
! s* t7 P4 j8 \3 ^% L8 O</code></pre>
/ t1 X" h8 M, [% F; v# Y<p>打开微信并锁定焦点后,我们开始输入文本。</p>
; `$ l6 Y4 W: I' _<p>输入文本可以有两种方式:</p>
: B9 d& b% K+ d* U" |<ul>- D, n1 G  o: t# Q
<li>
, n/ Q$ m* a0 G0 j$ D<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
0 |5 D9 J, j$ C3 ?<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>& y+ D' p$ I( @+ x$ E6 |7 t; \- v7 c1 y
</li>
: f. g- r% D: Y2 \/ X3 z9 k<li>6 @5 B$ I: V4 |3 j% X5 x3 M! U# @
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
& \/ _& g7 q0 s- t<p>传入字符串,但不能同时打印字母和特殊按键。</p>
! w& d7 T+ y; m  v8 z</li>
2 T; |( M* z; q5 ^</ul>
9 Z/ d  W2 k' E9 j6 S<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>( O! D7 G$ {' ^, \9 X0 N) `
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间- |5 q3 q0 Y) ~; L. ~) A0 ]! @' Z
</code></pre>
) Y5 L5 X3 H! j3 b1 ?: }: L<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>: v" A6 S7 W9 o+ w4 ^
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
; ?. u! M6 E4 e. g, apyautogui.click(icon_position)* f+ u. \! Z" t' ]
pyautogui.moveTo(entry_position, duration=2)
0 S6 A+ [6 g+ F  N" N( opyautogui.click(entry_position)# k# y" Y. p1 D
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
& L, Q9 d9 v: s; G, n</code></pre>$ ^) E7 }# M9 w+ r' B% m
<p>看看效果:<br>
! i2 M2 u: W4 u4 J8 N<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
, S; N/ W* h; ~) B7 g4 o当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>) ]" y4 m5 E0 N: H
<pre><code class="language-python">import pyperclip& n, a+ W. k& B% F6 M( X

- y2 U5 G! [& W. y! H, ~2 V0 wpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
1 P( b: ]9 v6 i7 ]3 r4 Kpyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
: d" U" I$ ~9 q& g9 O; R: o6 hpyautogui.press('enter') # 按下按键& `5 X+ X! ?" ?
</code></pre>; N& l4 J0 d. _5 k+ f
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>! I7 Q5 h7 f, z: u5 [, f+ @
这样,我们便完成了自动发送微信消息的功能了。</p>, b* b, u1 b) ^7 l+ V$ Z
<h1 id="apscheduler">apscheduler</h1>$ I9 h9 L, T8 g3 `( ^# R0 B: f
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>% \6 f2 G5 u9 f6 |. ^5 L  m
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
& N2 c: u: W0 o+ O8 ?7 V4 F" v6 Qscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
- [9 w+ v1 y7 q3 C& n. x8 u6 ~scheduler.start()$ U9 R* q1 B8 p' [( d
</code></pre>
0 R' p) j7 x: H4 u5 ^<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p># ~  k8 W* x) }$ A0 s# u
<h1 id="完整代码">完整代码</h1>, q7 {- T) h% o4 k& ~2 t
<pre><code class="language-python">import pyautogui7 a/ s5 _% q! F  N2 F- `
import pyperclip
- c" q, L8 a8 X7 [from datetime import datetime
% V9 ^  t* s, r8 w8 a( K4 D; I* t3 Afrom apscheduler.schedulers.blocking import BlockingScheduler
+ {! g6 X% p/ @2 w" L
; {0 X8 @5 S; Pdef main():
% g# |. P8 R+ ^        pyautogui.PAUSE = 07 ~; M8 w7 e" y
% v7 n- r4 c1 r
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
; C1 X) q7 m  x- t9 J        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置. _& b7 o. y3 Q3 m

; K7 l' n! X' y7 d' }        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
" B6 g. E5 {6 x" O9 M$ l* o; [        pyautogui.click(icon_position)
/ [, X$ z5 ~- {9 [0 b5 i        pyautogui.moveTo(entry_position, duration=0.7)
+ ?. i  v! M: f        pyautogui.click(entry_position)1 T) O% f7 A- f% j4 y6 j8 z
        pyperclip.copy('快去睡觉')& p: p; {6 h# n0 G
        pyautogui.hotkey('ctrl', 'v')8 n+ b, A% {" E: M1 t' r- i+ L
        pyautogui.press('enter')
& A: Q& V3 I4 R1 E9 X    pyperclip.copy('笨猪')( m- }! R- C; ]* r1 `" K
        pyautogui.hotkey('ctrl', 'v')
: E  ], u+ m* X; g9 a0 D        pyautogui.press('enter')
) p0 k  R/ |/ J   
! `8 O9 B: Y1 J6 f" cscheduler = BlockingScheduler() # 实例化+ a; u" j2 f* j5 U
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务8 q* I$ V) {( k1 j- Z3 {
scheduler.start()
0 D3 Y. P$ p/ [0 k/ L% h</code></pre>
% k! U( s( [( g0 y- m5 Y( B<p>完成啦!现在可以去睡觉了。</p>
2 z2 O1 o! n. o. e<h1 id="结果">结果</h1>7 r, P) Z& R/ j. X# l2 g
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>9 n& q: N( D6 t7 w, v8 _$ Y
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>- R' X0 g  K. c9 a- m  o
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
& P( Q* E! V5 k8 O. w$ ?<hr>4 ?0 D1 h6 s' |1 X$ I3 W
<h1 id="---the-end---">-- the End --</h1>
+ y3 j# q; ?$ @<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
0 H6 _- h3 a/ I<p>打个小广告:作者CSDN博客主页:<br>
+ l$ N" K4 c( p9 B; y2 Y8 T# v3 \3 ]<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
; u) U8 I  {# y
% O5 r; l8 `) Q7 \
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-6-29 18:25 , Processed in 0.065524 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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