飞雪团队

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

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

[复制链接]

8566

主题

8654

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

& q. m* H  |* v0 z, p* s8 r<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>* S) d# j# d% n/ b6 Y7 j. Q4 z% _9 x
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
3 e9 v' ~2 E1 ]不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>% P" F2 b# ~) C- c2 P' e
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>7 l5 }0 B, o% O# N4 e# G  z( r
但,女朋友的命令,我是不敢违抗的……<br>
) `0 Q: {8 Y+ ]6 O( y+ S/ t<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>. W: D! V9 L9 w6 C7 M5 |
但是睡觉也不能缺!</p>
& W$ k1 q2 A2 }7 I+ @<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
4 e, u! k1 \; n5 H, w<h1 id="python登场">Python登场</h1>6 D6 D+ e9 L" d( q
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
& z! l+ l& y7 P+ k% N- c" [/ t<h2 id="安装和导入">安装和导入</h2>( B" L9 s0 y7 d
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
* \! B6 `7 T# p5 Q<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
# ]6 z: Y! h' T' c<pre><code class="language-p">pip install apscheduler* |4 Z  t6 w+ i1 b3 S
pip install pyautogui
5 u+ w' W0 `1 T) O8 T</code></pre>" C$ C! H, G$ t$ ]. z$ `! h0 m. A8 A
<p>导入:</p>5 @1 `+ W3 j. K+ b7 q- |: W
<pre><code class="language-python">import pyautogui: m# E: S& |4 R  d
from datetime import datetime
3 i+ p- L( j; h9 E: ]from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
, S- r$ p: M, g4 h1 H# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
8 q0 F+ y: {$ n! P# from apscheduler.schedulers.background import BackgroundScheduler
: t$ e9 @! ?; ~9 }; d$ }3 z9 z</code></pre>: T, I+ H/ {: [0 E
<h1 id="pyautogui">pyautogui</h1>) r* W6 u: o- j  }& B
<p>首先我们来实现自动发送消息</p>
0 @9 y; b6 K  }: J- O7 e, G<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
- E- w) w0 \, ]/ c6 u<p>先来做一些基本设置:</p>
2 t7 X" X; K$ G- }3 }<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
( D7 c$ s& C' `% C# W$ r: Z/ u</code></pre>* Y; a8 v! d5 a" {( i' e
<p>然后我们登录微信,最小化。</p>4 g$ ^& z. l4 `1 |% t# {
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
- o! ~) m$ a5 ]1 u8 y( ^, w1 t<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)3 Y! ~9 ]7 }1 _6 [1 {/ p3 X7 z
icon_position = pyautogui.position() # Point(x=148, y=879)
" i4 e' z+ [- P$ i6 a</code></pre>1 O4 N5 D) S& t) {: v  y, c
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
# a5 Z3 k- _/ U# `2 l5 N9 R<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
* o3 o4 z4 ~4 h8 }<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)$ m( X( F/ Z! D- ~9 r4 h& w5 g( E& f
entry_position = pyautogui.position() # Point(x=174, y=751). r' M2 Q! |9 d* \3 u* h
</code></pre>- Q* ]+ n7 m0 O0 K! ~2 b
<p>接下来,控制程序依次点击这两个点:</p>: Y8 Q; `* R- u6 S
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击. S' N) G* H' {6 T) X5 s0 {  Y' `9 z
# pyautogui.click(148, 879)8 }( z4 J+ U# c' B$ B* X+ }3 h
pyautogui.click(entry_position)
$ ~8 h6 I" L' o9 t7 X2 H# pyautogui.click(174, 751)
) N) t) S0 B$ G3 _# _</code></pre>. s+ W6 A7 {8 f* ]' x
<p>打开微信并锁定焦点后,我们开始输入文本。</p>1 z; J) [8 m8 Y% w5 @; ]" h
<p>输入文本可以有两种方式:</p>
! L. l' E% r. ^<ul>
* [' G3 G. M0 {/ O<li>
/ W- [/ K% u' S$ Z* f7 ?3 q<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
% O5 V* o" a1 v<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
/ U+ d0 l4 C% e! @3 c8 J</li>
% G/ k: T, Y8 i" ^4 H<li>
5 @7 {4 ^  m* o4 R<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>  G6 X, R! \$ i) i# g
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
" I8 A# Q. b% {# }' z</li>  r/ ?4 u( \1 E+ s1 M; d8 a8 E
</ul>( J! V  P4 U. y7 \# `
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
& u! f1 W- W! s2 m<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
# b  x6 ?7 ~, q1 m</code></pre>$ K" ?* o9 H  ], G6 d8 T
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>* q. J  V$ i- e! Q3 @
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选# g- \) S6 q$ V/ w: f$ J( {2 |
pyautogui.click(icon_position)1 a8 B0 t2 P9 O3 q4 `3 ~
pyautogui.moveTo(entry_position, duration=2)
, n) X; E+ i( ^6 A( D# @4 Xpyautogui.click(entry_position)* `" v; ]0 a5 O! x
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选) V$ F* r% I3 b& N4 ?7 I
</code></pre>
" G$ Z3 j& e" O9 U1 q: m3 y/ O* E" V<p>看看效果:<br>$ s: R9 ]6 ^! y6 }' K# S
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
, i" \# p; ^3 P' P, t+ T+ J- d当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
- J  S3 |: v7 N# F; a3 B<pre><code class="language-python">import pyperclip; A& q" w5 h  G, y# u0 G& o
2 Y; ?9 C# a7 \3 g5 G* f. e$ l, u
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制$ {$ H9 k( |, c3 O
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴5 y/ M+ c5 @9 B" ?5 I$ ^+ V
pyautogui.press('enter') # 按下按键
# G. y: K; ~& J3 U4 D2 N' v9 d2 U/ k</code></pre>% B9 C; F/ O# X# ?) {
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
/ p" E) b* n0 Y1 ^+ z5 k这样,我们便完成了自动发送微信消息的功能了。</p>1 b/ w$ G% P7 S7 o3 V' ?1 L- h
<h1 id="apscheduler">apscheduler</h1>
* E) S4 a7 _8 Q3 ]" l* J2 Z" d3 v<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>8 |: D4 A7 K8 J, ^, U. B) n; y
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器& ^& L3 X: A, s" H0 z* l8 s
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务2 R+ Z3 }6 m" ?3 F4 \7 B4 {( N
scheduler.start()2 x0 C7 d! h9 @) v
</code></pre>
5 _0 K& N% G/ {/ E" R<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>$ Q* C  u" e& o* `" k, P( k
<h1 id="完整代码">完整代码</h1>
& e5 e+ K$ d  J- T: b/ @/ F6 }4 T<pre><code class="language-python">import pyautogui: G" L  S2 \/ Z4 W4 `9 _
import pyperclip
; ^  v7 }2 H; m& U: x- S! `! B1 Lfrom datetime import datetime0 E; s( ]; O7 w" s: {- T* s: ]
from apscheduler.schedulers.blocking import BlockingScheduler
' }. [) h( H4 L. ]
- \0 T3 q+ d- ?( h5 Udef main():' b& i- ]6 F# M
        pyautogui.PAUSE = 0. h; H( G, O  f4 S& Q# L, |
1 H2 D4 p8 k4 U2 }$ G
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置2 a4 T( z- o7 |3 `2 J  X: I$ Y
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
% ?* w% Y3 z8 j* z% J2 V- }7 |0 [$ o7 q  t# H: M& O( e* m! g. B, {
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选1 x1 o  X* u2 P* {# ~
        pyautogui.click(icon_position). n+ N( J7 r, B/ C2 u. b+ `1 `
        pyautogui.moveTo(entry_position, duration=0.7)
# Y! Z. {# ^9 ?. S3 y1 i/ c        pyautogui.click(entry_position)
* u# u: r4 V- N/ m2 e6 @        pyperclip.copy('快去睡觉')
: ~0 N" x. E+ k: \, p2 b        pyautogui.hotkey('ctrl', 'v')% H) L. J( I) q. @3 b
        pyautogui.press('enter')
& Y7 V; I' H  J# O% j    pyperclip.copy('笨猪')
0 q+ D' N- Y. f" O        pyautogui.hotkey('ctrl', 'v')
* W. ?4 n2 r* H$ ^3 y' |! s; ?        pyautogui.press('enter')
+ l8 Z. n$ c7 k3 O- v, S9 h    $ s$ L6 P  ^2 k0 W+ A/ B) P( F0 L5 l
scheduler = BlockingScheduler() # 实例化1 G, f6 g1 a3 o7 t
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务! u. A& }3 M, a' O% I6 w; j. f+ j
scheduler.start()$ T7 I) a( [% X4 n9 e  G
</code></pre>' o* f# L, |- O! R$ G
<p>完成啦!现在可以去睡觉了。</p>3 {  U  V6 A$ q! u9 J
<h1 id="结果">结果</h1>
! B; [2 [  S5 s* Q; _3 f5 n# r" F( k<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>0 p; G  K5 \* T+ d' c1 T; F3 ~
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
6 P* b; v+ b0 E3 ]# S3 I<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>* c: ]- r( U+ o4 \& _! l
<hr>4 n5 F% }5 D: L
<h1 id="---the-end---">-- the End --</h1>" n$ T( B0 }% B" [
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
9 L5 G7 `/ j0 c- @<p>打个小广告:作者CSDN博客主页:<br>4 K# i; i. c* H: ^* g3 J; A
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
2 O+ K4 G# P( A7 R/ y* s
, M4 i+ _1 q. R; u5 }
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-4-16 23:26 , Processed in 0.063519 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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