飞雪团队

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

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

[复制链接]

7854

主题

7942

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

8 k3 a* g7 I3 r* a<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>6 L2 v* O8 ]0 i: j6 W1 ]
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>% b/ f3 O' A- h2 G
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>- v5 r( H& E; x
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
6 T/ }* x5 m: l+ q但,女朋友的命令,我是不敢违抗的……<br>
) G8 q  U! A1 b9 `<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
9 L' N2 V2 y/ F) [但是睡觉也不能缺!</p>
3 a1 P8 F: z. w+ d9 A" \# @, p<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
1 t" K8 e8 v+ U2 }<h1 id="python登场">Python登场</h1>
% \+ H3 w0 K& C5 z<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>5 v. z" d' w/ P! a
<h2 id="安装和导入">安装和导入</h2>9 g) C- g) ^" B" A9 R' H& }
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
- u3 V# b+ }; n<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
) p  i. L- w; s: `9 Q2 j: n<pre><code class="language-p">pip install apscheduler7 C3 M) A2 x/ j# U5 e# x3 q
pip install pyautogui$ j# `4 T8 X) H3 d9 f& O
</code></pre>
- G) K6 k% |& ?/ B  m- O! `! I<p>导入:</p>
7 u/ [5 `* Q- @& ~) |<pre><code class="language-python">import pyautogui. v# M* S5 K2 S% A1 }' M
from datetime import datetime
( U8 V" f! n& ?from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
- l; h6 u/ p2 G' S0 {- [2 J3 r  f# Z# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
7 [/ a+ I0 K4 q# D; V1 I$ E# from apscheduler.schedulers.background import BackgroundScheduler3 k7 z& M7 A& n3 M% x# \* Q& i& f
</code></pre>* X0 d) h2 W& a: o
<h1 id="pyautogui">pyautogui</h1>
! e! d0 m- K4 H3 i, ~2 q& I<p>首先我们来实现自动发送消息</p>
9 e+ I2 _: M3 q3 a<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
" Q7 R# W$ h- e<p>先来做一些基本设置:</p>9 p5 Z  i" p! @% u8 O. u
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
7 \2 e2 ~3 y# w, s% G! ]</code></pre>
* M- e) v& z! x* ?! C8 r4 B<p>然后我们登录微信,最小化。</p>
& E3 J! O' A. K  k0 b" X; I<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
# D4 d7 K. H: p; @+ g; L( Y3 x- u<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)! b2 T" F+ g+ y% m1 \5 o
icon_position = pyautogui.position() # Point(x=148, y=879); _# A3 P' R( L4 `
</code></pre>+ y( X1 Q$ Y3 b( e) z# |+ g5 \! S
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>" `5 i6 v2 ]6 m0 t
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
/ T- U& P6 @6 d' i& Z+ H<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
, `2 ^& u' F/ Kentry_position = pyautogui.position() # Point(x=174, y=751)
& y; x, i3 E( x, u6 H8 V</code></pre>
' E9 ^8 d" G! H8 P1 n1 M) t' E<p>接下来,控制程序依次点击这两个点:</p>
! u" e' F1 x7 B<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
4 c, Y' b% B( t/ ^: B* `# pyautogui.click(148, 879)
$ Z4 ]* ]& z% n: K2 v' Xpyautogui.click(entry_position)/ S) a5 L+ g8 g3 {3 ?& t
# pyautogui.click(174, 751)$ c  |- t  i  v' X* L! C
</code></pre>/ x1 p' X& J; w' E7 x
<p>打开微信并锁定焦点后,我们开始输入文本。</p>
9 g; ~1 D6 c' c, O: U<p>输入文本可以有两种方式:</p>
7 j0 m) S) O1 Q4 }2 T. l0 F/ k* X/ m<ul>
% V/ F: N+ x7 |5 E9 s$ |; l<li>
* a1 b  n9 Q7 W/ ]9 V( D<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>% x+ L: g+ D& R, z8 ~) S
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>+ A& g# p4 p' T0 q$ p9 q, X
</li>% b; }. R! D  e7 m6 Y
<li>+ @0 p. h" c! |8 c
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>* K; u4 Q! _6 i4 ]0 _% p, V3 o
<p>传入字符串,但不能同时打印字母和特殊按键。</p>' J( y9 A8 L# f4 F7 @0 f$ j
</li>  s2 Z6 B7 o2 f
</ul>
- l0 E! B+ I; U6 W) {6 I) j<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>" P6 Q2 C3 s5 K( _/ G$ Q' F
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
8 H# J9 t0 d7 x' Z  Y</code></pre>. J$ C0 S* B. z. e/ V; T
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>8 U/ Y' d4 {# i+ E) k
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选6 M/ W  s# w9 J: _. G- C
pyautogui.click(icon_position)0 g/ A+ P- b% s' \" H
pyautogui.moveTo(entry_position, duration=2)" Z' N2 F, o* ?( m) ^
pyautogui.click(entry_position)
: |  S0 ?: A3 r9 V) gpyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
( ~' X+ z0 D, V5 f! {( Z$ N</code></pre>9 q  g3 F) h! ^4 _& l4 A* G/ a! V
<p>看看效果:<br>
/ Q1 F5 x1 C, `6 s<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>! b- J6 O+ `  R% G' L  ?1 F
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
1 S# N3 ~* V4 t6 E; P7 ?<pre><code class="language-python">import pyperclip
" D0 s3 N( |4 t" E1 A
7 J5 q; d: ^8 L( c/ Upyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制! Z, V) C, s2 L3 @: x) D
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
+ ]5 q1 a( E0 H0 Ppyautogui.press('enter') # 按下按键; R8 g: T& Q; X; U+ x
</code></pre>
% P6 L$ @2 y+ l<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
4 p, r6 `# G% ~这样,我们便完成了自动发送微信消息的功能了。</p>
( U* h7 V, T3 O. S<h1 id="apscheduler">apscheduler</h1>! \8 y, \, T" T& O- u) J6 ]# Y
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
! G: C8 [! l" e4 j1 ~7 R<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
4 v! o$ q" A& O; h# P' V  L% Z: R2 bscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
; \: [/ U/ @1 `4 xscheduler.start()
9 m4 t8 ^: Z, E1 x' A* K; L</code></pre>
6 E! Y* R: F4 j5 {<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>9 U5 R" j$ j* _
<h1 id="完整代码">完整代码</h1>
. U7 B; @2 V1 q( k<pre><code class="language-python">import pyautogui6 ^  B8 z* v0 t
import pyperclip
- g& q9 u& ~9 l+ Y( }# W' J0 ~. lfrom datetime import datetime/ P6 U& ~0 m  M, n4 F% l
from apscheduler.schedulers.blocking import BlockingScheduler! @$ j, D& H, P

/ P$ y0 Y) l  w  d) J* Odef main():: m3 @/ S! i3 _* v6 S* J
        pyautogui.PAUSE = 0
3 N. ^  d& A( u2 L5 b: n7 j1 L$ {7 K
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
; `; U. X4 l0 S( W        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置( o! K. ^8 _! `9 j2 h. v/ M
. }9 z+ s6 Q; t, s# p' \* B
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选8 p$ D* O! C1 k% s
        pyautogui.click(icon_position)
# T" l1 f0 @# F! W0 V        pyautogui.moveTo(entry_position, duration=0.7), J# T+ L! V) `7 P: w2 C
        pyautogui.click(entry_position): ?* m- _  y" _  r; z
        pyperclip.copy('快去睡觉')% L+ r% u, r* o4 G6 q" w
        pyautogui.hotkey('ctrl', 'v')7 \& z, l5 p- u0 u
        pyautogui.press('enter')
/ r5 H4 \7 O- z1 F" Q    pyperclip.copy('笨猪')8 k3 t  X& |' {7 t2 j  C
        pyautogui.hotkey('ctrl', 'v')2 _7 d5 _, `( \6 W- ~/ @% ^& h
        pyautogui.press('enter')
( r; m1 H  T, o* l7 R& R3 k    / G( Q8 U4 I/ @! K5 t
scheduler = BlockingScheduler() # 实例化0 [" a' C- j+ b+ f, Q7 D
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
7 N. W$ J1 l3 _* p! E* u$ `scheduler.start()
! S% e. a* |2 {- W3 T</code></pre>
2 q& u) ^9 ~  k- c( k' b7 c<p>完成啦!现在可以去睡觉了。</p>. M* ~' z/ L* Z, G' X
<h1 id="结果">结果</h1>
! c: x- X& ?! c7 p" |4 S<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>. t* T! B  w/ k# J: u
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
) D/ w+ [8 i/ Q  A<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
3 c# g5 t0 i6 Q3 D/ v( J, P7 _<hr>
' T3 w) v* G+ o: P( @- }( S<h1 id="---the-end---">-- the End --</h1>
9 q4 v; l9 {- @<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>* N3 u, J+ n9 b
<p>打个小广告:作者CSDN博客主页:<br>
9 p8 `5 ^! q5 X4 ~5 a<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
# D' \% _5 Y! Q& P1 V: s
2 x( g( A2 I# K1 K9 n) C, p; p
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-11-13 20:53 , Processed in 0.066651 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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