飞雪团队

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

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

[复制链接]

8993

主题

9081

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

; Y- Y; h8 I* B" ]<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>, f! }# g- a1 b1 I/ f
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>; ~  |5 n! p+ n  d
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
% a0 Z+ V/ ?# e# J" n: O4 n4 ^) H& q<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>, L3 `; U. d1 F/ F, F
但,女朋友的命令,我是不敢违抗的……<br>
2 A9 u& _/ J6 r/ t; H<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
, S" R6 x& o$ u* H" ~1 \但是睡觉也不能缺!</p>
! _" H4 C  ?! D$ n* R) B7 ]" F<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
0 w# w, {* t% Q" s# U! O& h  l<h1 id="python登场">Python登场</h1>
) o1 R0 W( R, _% }9 Q* W<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>, a5 `, {% Y$ w! S3 B
<h2 id="安装和导入">安装和导入</h2>
- P& C. Q! q3 _  Y<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
$ b3 m) C, a+ R0 `<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>' m8 B0 |; j! \" r# o  k
<pre><code class="language-p">pip install apscheduler
6 w( k7 [3 a. {+ lpip install pyautogui; x% d7 S: o- h5 w: U) B
</code></pre>
$ S) Y3 ]7 F: ]1 H4 G" O1 E<p>导入:</p>, W1 ?8 s. G# ]) q' R/ A' N! k/ x
<pre><code class="language-python">import pyautogui0 c' K* b7 b, v) A8 m  u" ?1 l
from datetime import datetime$ |$ L' ?  ]' Z1 ]0 q- t9 K
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
. `/ V/ ?/ u# \9 z4 F" Z# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:8 Z: P8 [- v  j6 x* t( g: W( T
# from apscheduler.schedulers.background import BackgroundScheduler6 P. W" A( L! v
</code></pre>' F9 o. }1 {& K$ [& z7 e; r
<h1 id="pyautogui">pyautogui</h1>
7 V7 J, g% m, o4 M% P<p>首先我们来实现自动发送消息</p>
/ R$ D/ P# S8 B% A4 `" ^<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
; B/ u* e& F- ~: x; |+ o  h<p>先来做一些基本设置:</p>
  ^- r- {/ ?+ W6 H; P<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快9 v7 D6 P+ u, q' S3 E, ~5 ]
</code></pre>
) O+ ]) x" N- q, A$ h<p>然后我们登录微信,最小化。</p>
2 r4 }% G2 k8 A/ i9 \- z+ A+ I<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
8 d$ X/ D  [* n  v4 T3 `( b& B<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)0 }: N0 S- m. g; x/ a3 \  [' D: ^) o
icon_position = pyautogui.position() # Point(x=148, y=879)4 Y5 E& [1 G- V, a
</code></pre>
; J  K7 }+ Q/ K' ]- |<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>. b: k& F7 L6 m, F# J& M. T
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>" _& g3 \) K  P. A* X5 F& h& T( S5 C! f
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)) ?( J) F8 ^" C1 f+ w/ b
entry_position = pyautogui.position() # Point(x=174, y=751)
# \4 u& j, O; [( @% Q1 j</code></pre>4 q9 A3 {. L- Z  X2 X* e
<p>接下来,控制程序依次点击这两个点:</p>& d- E+ M" z9 h) I. [7 M2 G
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击; D% `; S/ T+ ~* ]( `
# pyautogui.click(148, 879)
- C  O' a& ?8 ~9 }. v& Ipyautogui.click(entry_position)* J5 J6 H: {! g) u7 f; \  i
# pyautogui.click(174, 751); V* V0 e9 I: a1 \
</code></pre>
1 _  i6 s: n: O' h" T, S<p>打开微信并锁定焦点后,我们开始输入文本。</p>5 v3 j7 w2 e' g' w0 r0 K
<p>输入文本可以有两种方式:</p>
) l/ E% u5 q# ^<ul>
% s" L4 }7 [8 O% u: n/ C<li>) r/ y0 w* x+ B8 h  y7 v
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p># O' K' h" M- d0 v+ r& E# u
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
" m  G& F) o& \8 G. O4 e/ y</li>
: T0 ?3 a8 [- b( ~9 @<li>* o) K$ u: h% Y5 ~5 r, f: B
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
) ~+ s  ]5 j5 a; x# x0 w<p>传入字符串,但不能同时打印字母和特殊按键。</p>
  j! d6 v& W0 M$ _# X' }% t& l</li>
: B! \" o- s* z2 s' ^2 {</ul>
% C3 m) X3 H6 Y<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>9 a. Q0 A  V; P: [/ p
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
) p+ w5 j+ H9 N, U; b5 `</code></pre>  M9 M! e0 M8 c
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>2 V+ O) i: g4 Y+ t1 n
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
1 |  Z4 q) S8 y" Dpyautogui.click(icon_position)
! b( e" ~' ~* r7 v7 N3 M# Kpyautogui.moveTo(entry_position, duration=2)
8 s6 c' J& `( p, bpyautogui.click(entry_position)/ \% q2 y3 C& q8 x" D$ A( t
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
! W( B1 {/ r- M- b2 K. Y1 [3 B</code></pre>
$ b9 V; y% \1 x! a<p>看看效果:<br>
! a  C- o2 m, d6 h) w, {<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>% b7 @9 |: g& V% s. X# V" d& o, v( T
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>2 F$ z8 s1 k6 S/ U# O8 k, O
<pre><code class="language-python">import pyperclip
' q( w# g8 X) Z; ~( M( Q5 p4 f, A- ^) X
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
4 X5 I! s- k3 S+ Q: z0 g2 n3 A2 Lpyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
) k: y. A( n+ d7 f. d+ hpyautogui.press('enter') # 按下按键
* h0 d* g0 V* j% E- K8 T</code></pre>
5 V) `. N7 q" o<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
- {% P2 k/ X& d+ g这样,我们便完成了自动发送微信消息的功能了。</p>4 I( P! o$ M; A" a- K: c
<h1 id="apscheduler">apscheduler</h1>8 j8 o& L  x8 B3 j3 U. K# r) V. W
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p># ^( a8 ?+ ]# n: t. u7 _# F
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
6 q* K) t6 `" G3 y) R5 jscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
! M% E, d/ u% M7 wscheduler.start()
, |1 M2 L5 D# ], A</code></pre>0 M1 J2 q, S% s. i& ~/ M
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>& {! S; t" ?! ~3 t; t# H0 o# }% p
<h1 id="完整代码">完整代码</h1>
  z* o0 E! d0 \) u<pre><code class="language-python">import pyautogui
/ \& J9 l! o4 x! Kimport pyperclip2 v  j+ f( @& F. r; c% P
from datetime import datetime
9 x+ A4 F2 R/ {( u. F' e6 cfrom apscheduler.schedulers.blocking import BlockingScheduler5 c3 C/ X0 {# ]6 Y

  b- X4 u6 P0 b- L9 U3 f1 g2 Qdef main():
$ j5 _' \$ `( b9 ]- g2 m8 T        pyautogui.PAUSE = 0# h% _' N5 T5 a3 O2 `4 N- C

3 N! `: o% S9 g3 Y6 p, f4 V        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
& Z! I* u( f( B0 N8 M, h! o        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置# Q6 C& \1 @9 E: @

& `. v/ [( |1 s5 n1 @        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选1 ?0 e4 X) _8 ^6 k# U
        pyautogui.click(icon_position)8 T! I. v# x. {6 V! x4 |6 f
        pyautogui.moveTo(entry_position, duration=0.7)4 U- K8 P& T! j7 ]# O3 e0 J! a0 N# b
        pyautogui.click(entry_position)- Y$ u9 X5 B& Y9 l+ s" D
        pyperclip.copy('快去睡觉'); o# K: s0 Y* K  d( m. f; F: J+ S
        pyautogui.hotkey('ctrl', 'v')
1 K$ y6 o& j! G1 b. i! d        pyautogui.press('enter')
# s( C0 v: M* \5 _, C    pyperclip.copy('笨猪'), E+ C0 ?  o, d+ i9 s' b# U
        pyautogui.hotkey('ctrl', 'v')
/ N! i; S( s0 Y# R        pyautogui.press('enter')* \& i$ X% `& J& ^0 f
    " l% v% J7 }" M' i
scheduler = BlockingScheduler() # 实例化% b# {# v+ u. k( M
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务9 m: t$ L6 e1 ^- ]" b
scheduler.start()
5 ?" f5 q/ G7 A0 S# D$ m4 a1 M</code></pre>$ a- j+ {7 L' l9 I  {0 Y* p6 s# w
<p>完成啦!现在可以去睡觉了。</p>% d9 p; J; y4 j5 J
<h1 id="结果">结果</h1>2 C# f+ }$ k: v, l! ]* i
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>1 f+ {) G/ u8 F2 ^4 p
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
% t9 b  E) b( U# a9 Z- i+ M<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>1 r1 U) }# ~3 c5 P+ @
<hr>
  A8 |1 _  S0 ~1 w9 |- \<h1 id="---the-end---">-- the End --</h1>
( D' A4 k* \; X<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>2 P+ K5 _$ K4 p. k8 x0 h% @: o
<p>打个小广告:作者CSDN博客主页:<br>
$ Z7 k8 f  m$ A: u; ]- W1 t4 ^<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>1 Q- D' a; g, p' h7 D8 d

' @' h" `8 l! z# E
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-7-12 09:07 , Processed in 0.064638 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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