飞雪团队

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

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

[复制链接]

7992

主题

8080

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26306
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
& R' j/ p7 {) F+ i/ T
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
2 N$ l  T# q$ f* Q8 w% p2 M2 o<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
& w/ ^9 x1 `1 m不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>( U6 e1 D" {/ }/ q( v# y1 S
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>7 B* @) q  I" r! |/ a6 i1 l; N
但,女朋友的命令,我是不敢违抗的……<br>* u+ X! |) c# h% ?! c
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
4 Z( g. R5 s$ }2 Z; h! X但是睡觉也不能缺!</p>
9 ^" T' o' c' d9 _2 e7 C4 Q; U) o<p>这时候我们该怎么办呢?是时候让Python登场了!</p>1 d! _! S  |  H5 Q/ E& X* k3 \
<h1 id="python登场">Python登场</h1>
% ^6 r  |# Q6 v2 C2 y<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>1 E8 Y2 M# j3 \4 E* F5 C+ j; g
<h2 id="安装和导入">安装和导入</h2>
; a: y+ {% h3 W* L0 O/ k2 ?<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>1 `4 g# x1 s7 |: p' v# K
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
5 M+ _- J& ]4 c6 `# |3 W2 \9 z<pre><code class="language-p">pip install apscheduler
6 p3 E! p5 Z( A8 H& _7 \  Q# o  w9 spip install pyautogui: x- Q1 z, S9 N7 j" }7 A
</code></pre>
  u& N. g- U. z' |# _: a<p>导入:</p>. P; w; X& E( w' @" s" U2 M" w& O" n3 v
<pre><code class="language-python">import pyautogui
: X5 N: O- K& Y8 x& w& @from datetime import datetime: L0 b) H7 j2 L% w1 n2 G
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
1 R# w3 V9 k, s& Q# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:: _# k. M# m! V9 n' f% _
# from apscheduler.schedulers.background import BackgroundScheduler( K" ~$ `. \% B7 l5 W- e1 G# W: P
</code></pre>3 J7 V: l: M( d& W. t; z4 `; R# O
<h1 id="pyautogui">pyautogui</h1>
" ~* ^! d: z3 \: J<p>首先我们来实现自动发送消息</p>
1 m: M4 M1 ~  c) M9 v<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>: v: x1 _2 P) _6 ^. s
<p>先来做一些基本设置:</p>' P! k/ _. X5 h2 f4 w, c
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
5 O4 y& h$ k8 C* Z# }</code></pre>  r4 a$ ?. W3 Z; R/ R- i) r
<p>然后我们登录微信,最小化。</p>
9 H/ i0 I- [, c: i; q9 l! r<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
! W% ~9 `/ O& Y$ O% _<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)2 G9 s- ?" S4 u. f, Y7 W5 O
icon_position = pyautogui.position() # Point(x=148, y=879)
, ]1 D* l& C1 N7 a</code></pre>. G/ B2 B2 L" e$ M. z
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
1 [) [* m* R3 ^<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
7 L- l! C9 ^: x) i0 E3 i<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
" ^6 B( X3 `  J* J8 zentry_position = pyautogui.position() # Point(x=174, y=751)7 @0 y" q4 g8 U8 j' x
</code></pre>
0 }, F9 M: S* L# y' }0 k: }<p>接下来,控制程序依次点击这两个点:</p>
8 ]) G  x% Q! P" Q8 h<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
! y0 ^  }! R% c' ]& w5 k" Q# pyautogui.click(148, 879)
: l& u4 [9 ^1 b- ]3 jpyautogui.click(entry_position)" k9 ^/ m# T" \0 O
# pyautogui.click(174, 751)' V0 @0 V6 R9 W+ e8 @" {8 S
</code></pre>9 `/ c: ^( s* @+ \2 Z% @1 o" d7 x
<p>打开微信并锁定焦点后,我们开始输入文本。</p>
' P0 ^; y1 n; \7 |* R1 s" c# U<p>输入文本可以有两种方式:</p>( U  {$ y6 D7 R: s
<ul>
' s& f( b3 a- v, C; w* q<li>' w2 Z9 O% B8 o$ ?3 O
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
" ~- M) C/ U  S3 N" y7 @<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
0 O  x7 z( S/ a0 I6 i4 d; B</li>
5 J' f& ?+ W) B: \' e: N7 T7 w<li>
/ t- v0 P  V4 t7 f* J% K5 E<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>+ i# ~" n' ^5 Q2 |
<p>传入字符串,但不能同时打印字母和特殊按键。</p>; E5 n+ s8 ~  ]. N7 Q% t8 o; P
</li>% G- _- F/ O8 V) o( m4 B
</ul>& x$ U7 F) s3 ~3 ]! [7 s( i
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
3 G7 w0 g( u. E* _2 X5 F<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
$ e0 F7 e+ p, K- ~" R4 I</code></pre>
6 Q1 r5 R  ^! d% z4 Z+ q5 l$ g& q<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
* T* D" H* R' S* p& T1 ^<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选$ ]+ I9 N: F/ h8 N0 M. Z
pyautogui.click(icon_position)3 T' u& l( s3 t' s/ Y/ U. J
pyautogui.moveTo(entry_position, duration=2)
" d- J  W3 M4 \8 _pyautogui.click(entry_position)& }. F2 O  d0 v1 ~4 Z
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
) x9 B5 n' b/ l/ R2 v</code></pre>) X* ?% ^& ?, f9 b5 Q* \
<p>看看效果:<br>3 d" Q4 H! @0 H! K$ q5 C) l
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
& h) N/ v8 G8 X+ f7 t当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>  g- y8 c1 E2 P% J
<pre><code class="language-python">import pyperclip+ [. S& ]: Y3 w& A
" Z+ r0 ?; H5 k$ A
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制3 m3 _" g4 o; s. t" W9 B
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴, b4 j" q9 `. q+ W0 w7 h1 Z/ q
pyautogui.press('enter') # 按下按键
" \! N+ G2 o; M6 t. f- [, s9 x, ~</code></pre>
0 e' i! e0 `5 V% |7 w0 Z<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
! Q' |: ^* G* R" G: ]这样,我们便完成了自动发送微信消息的功能了。</p>& G6 M) _6 D# j6 e; j
<h1 id="apscheduler">apscheduler</h1>
) j$ I- u8 D8 k' p<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>% p$ i, ]8 o- u4 A+ x
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
3 g4 m' J1 d. y+ l& q. ^scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务) J3 ~/ j- l/ e3 ]
scheduler.start()+ |' a/ Y) P0 a: z7 L) C3 A7 m
</code></pre>
/ K* A3 A  G$ m  d$ V" y1 h0 c5 B<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>) ]# i' G0 Y( ~6 g# _* L% j
<h1 id="完整代码">完整代码</h1>( ?/ i( u+ ?" ]4 l! `/ S. I& t8 g
<pre><code class="language-python">import pyautogui! C! m8 l9 [9 C+ ~( P) {
import pyperclip
2 D1 j* f6 z+ ?% j3 y: ?; S% Lfrom datetime import datetime7 p8 }* Z# |3 a$ U
from apscheduler.schedulers.blocking import BlockingScheduler$ x5 N6 \4 A. j/ U; O0 N+ A

2 @3 g' k" G) `- O, D0 F4 ?def main():
% U2 m2 e( A% c" r        pyautogui.PAUSE = 0: V% Y$ T8 \" j: C
3 k* m4 i% @* z& E1 P
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置; g6 x7 ]9 J2 ?5 z2 o
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置- f  m( [% W. \4 I: ~/ i: K/ G
5 y* t6 V1 C9 o+ T" d
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选) w4 ~7 m* F4 J# M6 p( @0 V
        pyautogui.click(icon_position); R) t5 y; l% B, P; T5 Y6 a
        pyautogui.moveTo(entry_position, duration=0.7)
( K! ^/ S0 ~' R* `  H        pyautogui.click(entry_position)) p* X- U5 f# w6 O! f, c! ?0 I
        pyperclip.copy('快去睡觉')9 P. [, }  G4 u
        pyautogui.hotkey('ctrl', 'v')+ T# G$ d$ _6 X4 d' H# _3 F: \
        pyautogui.press('enter')
& \9 L* t' _3 N+ W  I! P" P    pyperclip.copy('笨猪'): u9 {6 ?* @2 {, l3 H; ~6 e
        pyautogui.hotkey('ctrl', 'v')+ B' K4 K: T! [0 b* e6 e; V
        pyautogui.press('enter')# I/ n$ C; G0 X, J: r6 e7 T
    , v! M- M7 r% }% l( p
scheduler = BlockingScheduler() # 实例化
/ U% k, G! I! g' s; }scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务6 t# ^8 H$ Z/ l! J/ _
scheduler.start()6 n% e% Z) a. X) ~7 N
</code></pre>
* D) B4 o7 k5 Y$ s$ L: G6 V<p>完成啦!现在可以去睡觉了。</p>; |4 L) _; ^* `3 ?- M: g" B9 A
<h1 id="结果">结果</h1>
3 F4 _9 l( B9 Y/ l* R  }<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>: ^# P8 P0 S3 i& \! v2 m& E2 y
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>; e0 V* r" }1 j- q/ O' ~& F
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
) X; b$ U' v6 {4 ~. s& [3 R6 f<hr>
! s, v6 `( t& d. F0 S/ ~. ]7 K<h1 id="---the-end---">-- the End --</h1>, d  H$ `6 O) x, X2 a7 V- h" e
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>: g  T. c+ |& _
<p>打个小广告:作者CSDN博客主页:<br>
5 N8 K. O; E* \: r7 t1 j5 K6 B<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
4 G6 a2 F8 v+ s0 I
. X; S" T2 I+ k6 A
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-11-28 03:09 , Processed in 0.063303 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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