飞雪团队

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

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

[复制链接]

8019

主题

8107

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26387
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
( x; ^: n, w! b, x) j
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>6 b2 b0 F- ?+ I% {4 t* g" N
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
/ M/ O* q# U# i  _/ Q2 j4 s不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>5 K2 g' g8 |; X+ ^' H
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>  q$ q/ B0 p- Q( ?# k* x
但,女朋友的命令,我是不敢违抗的……<br># m' Q" H( n" r1 Z1 p
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>7 U8 e& P7 P, V& h( F
但是睡觉也不能缺!</p># Q7 t  ]: p6 t( ~" J! d8 T  Z
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
: a7 O6 T6 o' B9 z& Q3 K! m<h1 id="python登场">Python登场</h1>0 ?9 V% O7 x% ?8 T
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
" \' ^6 S. @: B1 p  N. T<h2 id="安装和导入">安装和导入</h2>3 m9 k$ z  E' N
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>5 k& B4 \2 l; a1 f6 A, j3 K/ y) [  x
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
: t; }4 P, u9 j4 ?4 f3 L<pre><code class="language-p">pip install apscheduler
7 d' [2 N! _* m* u1 upip install pyautogui# T% s, U% h1 `5 {# i% X5 c8 p
</code></pre>
3 ]5 h% i, C/ \$ ?+ E6 x<p>导入:</p>
6 \* ]7 u/ s, t$ h<pre><code class="language-python">import pyautogui
% R5 u8 u. n& c5 X& g8 G1 S: Kfrom datetime import datetime2 \! K$ ?* _9 C
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器' g2 S7 C  g& b* M3 L
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:8 `! X  ]) Q# {
# from apscheduler.schedulers.background import BackgroundScheduler
3 x; Z0 H# i3 z4 s) s/ w) i- ~</code></pre>
: h4 _! R( v7 m3 [7 ~) Z. B! n<h1 id="pyautogui">pyautogui</h1>: C4 M' c$ \) }9 H7 X
<p>首先我们来实现自动发送消息</p>
/ U. J$ Z- y+ p% W9 i# z  H<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
. b, \6 t( ^  T; F<p>先来做一些基本设置:</p>' W- U  P6 G: ]- B
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
+ \/ i5 N8 c% z' D3 t</code></pre>! D% e* |0 K& j; @; t) l4 k
<p>然后我们登录微信,最小化。</p>
3 z* }6 u7 A% @3 B7 m* g+ D+ V' i<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
2 W: |2 Z) E; n( ]. o* J+ p2 ~0 C" `<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
: i6 M: D5 C  F$ {icon_position = pyautogui.position() # Point(x=148, y=879)* V0 g, w$ |3 r% Y
</code></pre>
* {" ?) s. f2 z( K+ V7 j% \<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
& |: f6 j- \7 t" G0 x3 D<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
; V1 ]# F: P: s9 O0 j<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
  ]+ j$ A4 M  W  C. Zentry_position = pyautogui.position() # Point(x=174, y=751)
3 ~9 P9 L# F; \+ t</code></pre>- f4 A% p8 r1 I# m8 u6 P  s* b
<p>接下来,控制程序依次点击这两个点:</p>
5 X! e  m4 ~( G<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
, N; b& a! R1 M8 b- S# pyautogui.click(148, 879)
) o% \+ q6 {: A4 K8 v+ w6 qpyautogui.click(entry_position)) X! w) C( {8 X: _$ V1 A/ U
# pyautogui.click(174, 751)6 k$ T2 k; T  U7 s( L' x
</code></pre>
! B9 V, |& [4 [0 G<p>打开微信并锁定焦点后,我们开始输入文本。</p>$ Y: _$ T8 R2 s2 D
<p>输入文本可以有两种方式:</p>
' Z( U0 C! p: a% w( P: y: W<ul>2 u  Z) z0 w7 N2 g6 [0 X0 M- a0 Q
<li>9 j" l: [& t' B, C3 E$ D' s% N
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>+ V$ s+ J$ ]$ v  ?
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>4 D+ n: `( J. x  _
</li>% A' }! h  K6 J
<li>8 ]( O! v8 F( l  z4 f7 A+ y
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>  D- ?' I/ V1 \& A+ B
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
$ T3 s2 J/ {7 ?$ i$ a</li># O* E* }! |, W: p7 X/ b
</ul>9 V) ?& X# W# s+ Y. J( T; ^& _
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
" x1 ?/ E% q( i0 s<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间" j" H& ^: [5 I+ [8 s9 b  h" X
</code></pre>
4 f$ j4 V/ H1 P+ Y2 p! c' ~* I<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
% i  r# x1 i4 w" Z7 j, w. r$ p) U<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选0 P0 l; I: f( E9 s* X
pyautogui.click(icon_position)) ^, M1 N: Z/ P% ~
pyautogui.moveTo(entry_position, duration=2)3 k4 L) ~* r( ^. Y/ j) Y9 z* s7 S
pyautogui.click(entry_position)
% W! Q& n. b2 Q, k- d6 i" ?% Upyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
. z" Z1 t6 L) R8 Z</code></pre>
! c* i8 O4 A( `/ p$ q<p>看看效果:<br>
& o/ t" S. V8 h<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>  k0 N7 K7 ?( W4 W7 {% y
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>' o: ?+ X* Y" N
<pre><code class="language-python">import pyperclip
5 v8 r1 ~3 W2 p) y5 y$ Y2 C: g
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制& B, B- K; {3 ^1 @
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
* ~2 f  S+ }2 x1 B0 U9 o$ `5 l# apyautogui.press('enter') # 按下按键5 @" b) f% m& T& _! r8 s
</code></pre>  W9 h* F# H+ V0 {* |* h
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
1 o5 L* Z0 l. K3 ?% m这样,我们便完成了自动发送微信消息的功能了。</p>
$ N$ V* B; [% R+ ]" O+ n<h1 id="apscheduler">apscheduler</h1>4 O9 M9 B% g" D
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>9 t7 z( k: g( I1 k% z
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
/ p: }4 ^* E, `6 p& v- y/ \1 \scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
* K6 ~$ |6 C, g) p; u' r1 nscheduler.start()) c. ]+ _! z2 ~2 Y
</code></pre>3 d. a* I9 e4 t8 \0 [) ^
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>) R" E+ }1 i$ x% `8 T
<h1 id="完整代码">完整代码</h1>
/ _1 Y5 S3 z* z! m* t" W1 A<pre><code class="language-python">import pyautogui
- p2 [4 I; }# E; limport pyperclip8 @( p' z5 l7 H- q4 N# K0 w8 a
from datetime import datetime
$ N. m9 h# Y, |8 W8 tfrom apscheduler.schedulers.blocking import BlockingScheduler( L) r8 r, M+ y3 |6 G: x

) I/ z% p! i8 Z4 mdef main():$ k- o" C3 [8 J8 V  ]
        pyautogui.PAUSE = 02 H5 V$ g/ c( f0 Z1 g

3 u' E0 g$ }9 Q7 r- D4 ?- ]6 ]9 G        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置/ U# J5 P; H- m6 D4 g3 E
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
: y: m: j2 N# V3 h* U9 ~5 f# ^) `. g- y! y( m9 |) Z6 n
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选/ |& n& k: x! l
        pyautogui.click(icon_position)& T7 d# t" u5 c/ ?# I
        pyautogui.moveTo(entry_position, duration=0.7)* r4 P, A1 Q6 V0 l8 X' A* \# z/ x9 L
        pyautogui.click(entry_position)
% K$ y( G! G. ~& K, X; i        pyperclip.copy('快去睡觉')0 @9 T# h3 \/ ^
        pyautogui.hotkey('ctrl', 'v')
! g% K: n* s& y        pyautogui.press('enter'), h  w0 [- D% ]. B4 [+ x
    pyperclip.copy('笨猪')- ^, k- N$ y# y# u2 h6 m
        pyautogui.hotkey('ctrl', 'v')
5 d, p# ~, i' n4 `/ k        pyautogui.press('enter')# ~( S# Z- D& `
    6 ?0 h: W  a1 t/ i2 ~
scheduler = BlockingScheduler() # 实例化! L4 H1 ?8 ^6 Y, u
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务* e1 v* ]) ]8 Z, ~3 W
scheduler.start(), P7 _) X" L- m* z. ^1 K5 e' m
</code></pre>
8 Q' C7 a2 S; b- s9 m0 n* d. [" v5 e6 I. Y<p>完成啦!现在可以去睡觉了。</p>7 E4 Y4 ]6 f& B. X) {* v
<h1 id="结果">结果</h1>
3 M  p* C3 v1 R5 l- m! J4 p<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
' _8 w4 S) t4 s) D! S- F0 G- c4 g<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
' d3 W* k- t6 }9 m, V- }  A) M<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>' h! X5 U# y! `1 O- ~* |/ X' z4 H# y
<hr>$ j$ Z0 P5 p' [( S
<h1 id="---the-end---">-- the End --</h1>
& @9 M0 E4 w9 W" c" U<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>' v" x7 y8 F4 N6 j1 U9 e% o; V0 ^
<p>打个小广告:作者CSDN博客主页:<br>; X# m" K5 ]; s
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>/ q) a. T$ t: \& p0 X* I/ e" a+ n

& R8 h& ~7 o$ F  r* ?# O7 D6 X/ \
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-12-1 12:11 , Processed in 0.063668 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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