飞雪团队

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

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

[复制链接]

7830

主题

7918

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
25820
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
: b& q0 J$ w3 e* P2 T  y9 K* M
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>* p# Q8 W' _7 ?% h
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>- b8 s' ~& P" ^6 f
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
, ]. M& H- |( @( z<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
* l5 q6 w9 O6 P但,女朋友的命令,我是不敢违抗的……<br>
) m; }9 L; L! _<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
( @( K- ^1 B9 _, S但是睡觉也不能缺!</p>1 T, @3 v* m- l2 L0 a2 d
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>+ k* t+ O( E9 X6 T5 P( `" F0 o
<h1 id="python登场">Python登场</h1>
1 P6 R: C& R/ ~! T1 E<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>4 U5 g& g8 ]6 \3 v
<h2 id="安装和导入">安装和导入</h2>+ c- a4 b0 D+ j) J# ^. q
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>% c4 Y' N1 ?, @# ~
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>/ [5 S- o. ]! N) {- i4 E3 L' B
<pre><code class="language-p">pip install apscheduler
3 _' N/ p; g( L) bpip install pyautogui  {6 N8 j4 b  G& Y
</code></pre>% M* P4 s# z% u! ?
<p>导入:</p>
7 N3 |3 |- c) M& K8 B<pre><code class="language-python">import pyautogui) J4 n7 U9 z2 k! ^$ U  z3 ]0 o" O
from datetime import datetime
( t6 r2 `7 o- Z' Kfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器3 O, l$ A5 @  Z. K) ?# Y' y
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:$ f2 j  T, o: q
# from apscheduler.schedulers.background import BackgroundScheduler1 S; Z& I3 o* D
</code></pre>" Z# n2 p; L9 J1 j. L4 u! q1 L: z" P
<h1 id="pyautogui">pyautogui</h1>
' r0 w, d+ l* O% |, l  r<p>首先我们来实现自动发送消息</p>) T7 R1 N& `9 x0 \: g
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
, S9 A5 y) _) _+ h2 }5 F$ e<p>先来做一些基本设置:</p>0 I4 [. m5 Q; d* u! D
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快5 H7 f  |7 T- D# E; ~
</code></pre>- r1 Z( E6 R/ x  U- Q- c
<p>然后我们登录微信,最小化。</p>
2 I6 D3 \5 C" ^8 V<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
% \9 Z. ~- N7 `3 a2 ~. U4 _4 R+ ^7 k' P<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
9 N# t& ~* K% r  I5 F! S9 kicon_position = pyautogui.position() # Point(x=148, y=879)- ?8 c; U8 f) R
</code></pre>" l: b3 C1 y6 T3 p1 r8 f
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>* a/ T2 ^/ M; b: y" l
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
9 h# V+ b+ @- J3 I# {: B<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751). s7 @. G/ M* ?6 r7 q0 D5 |
entry_position = pyautogui.position() # Point(x=174, y=751)
7 z+ T! l) X0 Y$ q$ W</code></pre>( a* @8 y) n* q
<p>接下来,控制程序依次点击这两个点:</p>
: e; j, E) `% `' \0 q) M<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击% ^% ]- P2 T+ ~- e( G0 j
# pyautogui.click(148, 879)% _; q3 D8 Y, X; }' m
pyautogui.click(entry_position)
) K" J; h& H* f( k% q# pyautogui.click(174, 751)! r) J, _% u5 i% G% ~
</code></pre>2 L3 T& b: G4 I0 |' E! o
<p>打开微信并锁定焦点后,我们开始输入文本。</p>3 z1 K7 x& Q# D( r2 J' J/ M
<p>输入文本可以有两种方式:</p>
& _$ C# X8 _& r( ^3 @2 `' O; e" H<ul>9 A4 d, S$ h: O+ \- U/ h, w3 i  x
<li>
2 j( B% ]2 H' S" o# L6 ]4 e% _<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>: T- k' J% k. v2 c. ]
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
1 I  G. `5 `& j9 {: S& ^</li>& n$ t7 s4 G! A& w- q8 n
<li>5 ?$ d+ z% I( w2 b$ I/ o
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>  Q2 o$ R; J6 n6 `1 t" P- L
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
! L  i# ~* d9 O8 H6 T# h) T1 Y</li>
, H" ?7 V( o8 s1 t% @% H* c3 n( y</ul>
9 Y  ~4 E: M" \" ?3 C4 k" {<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
5 o2 H$ U8 t7 b4 t<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
( f/ H& F+ t3 f0 q/ l/ `6 ?</code></pre>
) h7 v0 q& e1 j* M( c<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>( }0 g6 s/ i9 [: _6 n
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选7 o$ q* P& @  G! P6 o7 `9 D/ b
pyautogui.click(icon_position)
8 z2 X% z. l& K4 y" C  _pyautogui.moveTo(entry_position, duration=2)4 ^' `5 p+ r% R
pyautogui.click(entry_position), v5 n% s/ q! ~0 X  t% s, G5 t8 e
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选% P# z3 F; M- Y& t3 J
</code></pre>
8 ]* v# I" K) q1 s$ b/ m<p>看看效果:<br>$ S7 k  i$ d" V" r  @
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
2 l2 a  L: h4 e( k3 d/ N当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
1 ^9 A# }8 b; v<pre><code class="language-python">import pyperclip
  a5 r0 E- y- }# R+ U  `# M) w
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
, l. g4 g0 l* G4 [% k" `  Apyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴6 v# I, N1 I9 ]3 u4 W) z$ T
pyautogui.press('enter') # 按下按键
  |: n/ O# O% w' C</code></pre>/ o& J1 E6 c  U* [' ^
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
7 A) {* [2 u% |# f4 v4 |+ B这样,我们便完成了自动发送微信消息的功能了。</p>( y  @$ q* L) M
<h1 id="apscheduler">apscheduler</h1>
5 T2 W% T: e# Q0 u<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
1 s: z: H4 A8 a# M8 T$ b5 k4 s<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
& m$ Q7 x9 v: ^scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
, s8 E9 f  N8 U+ Q9 N5 ?0 \scheduler.start()5 @; ^3 n2 H7 e7 \4 a& J4 C
</code></pre>( B$ p* c  g7 x9 B4 m0 @6 P
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>
5 K3 g+ ^7 c, C# X<h1 id="完整代码">完整代码</h1>
  ]/ x) M# `$ y0 B  S<pre><code class="language-python">import pyautogui
. q3 {: R4 ^( @( V3 Ximport pyperclip
7 R& k( T# H' R, `from datetime import datetime; o% f# u) C" C; l) h
from apscheduler.schedulers.blocking import BlockingScheduler
* _1 y" G' U1 i* x
7 y' X% ?% q+ y: Gdef main():$ R. [  l. t; u+ ~* r: e# c* _
        pyautogui.PAUSE = 0
7 F! R; Y5 @+ L3 l3 I1 a8 W: J& f, ?7 L" K3 S
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置2 B$ ~! i  c% M; l2 \# G
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
. J; {, W+ g% G1 [% f. ?- K% T4 b( M2 {  {9 H8 G
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选9 _! e, G3 h/ X9 e$ w6 ~% w7 w/ D! @
        pyautogui.click(icon_position)
, y  M* x/ X4 N        pyautogui.moveTo(entry_position, duration=0.7)& W. K( z  X% k, `# L) [# W" y
        pyautogui.click(entry_position)
2 b& O$ @( B- ~: u1 x        pyperclip.copy('快去睡觉')
2 F7 C  c# ]9 k; P) |        pyautogui.hotkey('ctrl', 'v')2 p( ]" c  f( s# `( }
        pyautogui.press('enter'); l8 W+ h8 C  i: p9 M4 l7 g
    pyperclip.copy('笨猪')" K0 t. F; n& p
        pyautogui.hotkey('ctrl', 'v')
: _$ B3 I  e  B2 d) l4 i( p        pyautogui.press('enter')
4 c3 z$ n1 d3 A; R) H5 b$ k    * F1 V- f9 W" \/ i/ r
scheduler = BlockingScheduler() # 实例化
7 A9 }. h4 T( p# Gscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
" P; h4 ~" g  ?" b" @" ]scheduler.start()
5 K) D. v! \  ?4 ^</code></pre>+ |8 z# x, j; N; e* P: R3 Z
<p>完成啦!现在可以去睡觉了。</p>0 c( k, H/ ?4 l! n  H9 E9 u
<h1 id="结果">结果</h1>% p; u' Y5 {. h8 Q( J9 h
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>, z" l- [' i# |' W
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>( m  C9 X  A7 {8 J  ]0 a% K
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
  V5 v+ v$ @1 @9 f6 N<hr>
: B5 B# M' g+ Y7 _, G<h1 id="---the-end---">-- the End --</h1>3 Y9 K8 [# c& a8 Y! L
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
' W% t  ]1 l1 D0 [; E* }! K<p>打个小广告:作者CSDN博客主页:<br>
/ U* D2 H( S* @" I<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
9 \- m6 I9 M- K# d- L5 Z
4 s( f- K& T8 t0 Z8 J+ D, E
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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