飞雪团队

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

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

[复制链接]

8049

主题

8137

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

1 P) v! x' `% T<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>6 \) u, }' w, g3 f
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
; u' }# M( j7 K5 I+ D) o! n1 D不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
( t1 y) h: P( P, H3 L<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>8 _6 r+ c6 \7 s4 ^
但,女朋友的命令,我是不敢违抗的……<br>
4 L0 i# L# [/ H* V( n7 B<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>3 G4 O0 y: ]% O# g1 ^
但是睡觉也不能缺!</p>
0 x9 d$ |! u/ T6 M9 G' i( t3 s<p>这时候我们该怎么办呢?是时候让Python登场了!</p>3 v! q3 c" X; I7 Y, i% v8 |
<h1 id="python登场">Python登场</h1>
% X1 ~7 u; `1 Y) j2 Z9 M  d8 t<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>6 W1 U2 m7 @' S/ Y/ ?# p) C
<h2 id="安装和导入">安装和导入</h2>
$ P1 f. \& X! `3 ~2 z<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>9 F& K" U6 I7 t& Q$ n! F: l2 K: v
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>! g; }& j0 P# O' R8 l
<pre><code class="language-p">pip install apscheduler7 s$ I" z4 G+ S9 }1 a( L
pip install pyautogui! ]* X3 S+ u: l" {( T; c
</code></pre>
7 M8 b8 }8 L4 R) U& n) }2 Y<p>导入:</p>
$ c3 }- E: Z# p<pre><code class="language-python">import pyautogui
8 A6 L- O$ i) m3 c4 Efrom datetime import datetime
0 S% q0 n$ L+ ]% Kfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器7 p$ V  |* N$ A2 _* ]
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:! Z# k4 y, D+ H
# from apscheduler.schedulers.background import BackgroundScheduler. [8 G5 b# c1 ^1 h& _1 W& k, I
</code></pre>
4 h$ s4 \3 }9 [7 x! \# X9 M8 p<h1 id="pyautogui">pyautogui</h1>4 ]- q7 y2 m7 ]5 x+ L
<p>首先我们来实现自动发送消息</p>
4 j+ |* h8 {! n7 K<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
1 [; n* z! d, q4 z+ R<p>先来做一些基本设置:</p>
1 X! ^+ R# L1 y<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快8 I+ Y* i8 j  J7 [4 S, ]
</code></pre>* N% n+ V9 p  K4 h7 ]
<p>然后我们登录微信,最小化。</p>
8 t+ F4 X' q# d) O# Z, E8 A<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
  ?; @7 g2 h9 t' ~<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879): _/ d) d/ K6 M
icon_position = pyautogui.position() # Point(x=148, y=879)2 A6 H! Q; R3 M9 j! {
</code></pre>$ N3 t6 Q9 d- b* E/ ~- v& E' Q1 h
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
' q! f, ]$ Z( |" ~3 P<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
' ~9 [4 j9 f0 C  C! F9 N* j<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
6 D2 ~& A0 t( \; B+ D; D5 S& B- U. |entry_position = pyautogui.position() # Point(x=174, y=751)
& o' l! P6 i. M3 E, e( c</code></pre>
7 X! }3 V" X0 r+ ]3 n<p>接下来,控制程序依次点击这两个点:</p>
0 E9 G& r1 p% P+ h$ z<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
0 q  @, D5 E+ v$ y7 \# Z4 w# pyautogui.click(148, 879)
' E9 ^2 j) b9 A7 b8 }# Spyautogui.click(entry_position)
6 \1 p/ ^  p/ I2 Z& |+ }# pyautogui.click(174, 751)
* R& [; p; ]+ f) l/ v% }3 a</code></pre>9 s- O0 z! y$ U3 G. U' }  L: K
<p>打开微信并锁定焦点后,我们开始输入文本。</p>) r- o( i( L0 Z, v
<p>输入文本可以有两种方式:</p>
  g* a% A- U2 [<ul>/ J4 ]# C# Y' k9 p0 d
<li>0 K5 S/ K+ ]! K; S" I9 s1 t
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
9 c0 `# F) {; V<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>8 M% M3 v# A% q0 t9 W
</li>8 Y# ?8 u, m% \/ x" `+ k" b6 j( X! b
<li>5 _: Q+ N& _" {4 \# }/ K
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>! R- {) B$ ~  U
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
5 }# U/ @8 b& I3 `5 J& s1 S) `</li>
8 c0 q6 @2 X5 h; }' z</ul>
# E# o; A; X2 f, |6 a& F3 }<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
" c0 T/ @- P, y<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
: b& L) N5 `& @' P6 h</code></pre>6 u# r1 J+ a1 }$ i9 M3 _
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>$ d/ ~0 l: F* X$ x
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
% j% \+ i/ X: A8 P+ [' apyautogui.click(icon_position)
  K9 q, B0 q8 i0 Apyautogui.moveTo(entry_position, duration=2)8 s/ I) P4 `/ a
pyautogui.click(entry_position)4 F- o4 j+ `- y: j
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选* c9 ~; A4 b, r  {/ y
</code></pre>
8 w( O- g# u% R9 A* d" @- I5 ^( d3 V1 }<p>看看效果:<br>
# {2 x7 E5 B/ P<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
0 G0 n+ ]3 A( I# B% s- D3 L当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>" B3 N( Y( n8 u$ l6 x- F; ^
<pre><code class="language-python">import pyperclip
: w8 }; S  s1 x! \9 H( S  y) D" g' T  b; ]" t
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制. Z+ F1 d% n! k1 `# V7 R) V
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴1 }! |- ~; b! F4 ?1 y# @
pyautogui.press('enter') # 按下按键+ b' V$ C/ K# }7 G9 [: M
</code></pre>
/ b, |- ]9 ~9 N5 U4 w8 u; X9 l<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>5 F: n  z/ I: B& |# O3 S" l2 @
这样,我们便完成了自动发送微信消息的功能了。</p>  x# _9 e% D9 x5 E, q
<h1 id="apscheduler">apscheduler</h1>7 G- m2 ~% P+ D0 f& b# ]5 I
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>0 e9 g9 M$ i$ s/ M9 f5 L2 n
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器+ z6 o  P, s* b. ]3 i! e5 Z! g( G3 u, n
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
) `0 e  g4 m) S+ E& u- ^- R3 \3 ~7 lscheduler.start(): E8 {# \& t1 g; }# E7 g
</code></pre>% o" {( }, O) u2 }7 o" E
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>3 q5 l7 O' C3 J
<h1 id="完整代码">完整代码</h1>, E2 b1 X9 u9 i+ Z$ q4 f! p- p
<pre><code class="language-python">import pyautogui  m, i) ~* B/ `# G
import pyperclip
7 @* Q+ H  e/ U: n8 ~& [) Z1 U, cfrom datetime import datetime
+ J, n  y* Y3 k  tfrom apscheduler.schedulers.blocking import BlockingScheduler1 V- ?1 v& Z5 C9 m8 N# t: b

( E# W5 _5 s( J* a& Pdef main():) N. |+ y2 V3 q& L/ b" z, N* S( b; X
        pyautogui.PAUSE = 0+ `" \% h' [  H
& F- Q* \/ K! n' N. U$ o
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置1 e9 T3 c$ u- X8 ^
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
; t$ A& v0 @( g7 V8 D5 G
) Q# u1 N5 |) B1 d        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
2 Z2 s& h7 L/ p5 w/ E  ^        pyautogui.click(icon_position)& ~9 H; ]3 K# u0 w0 X# o( @7 y
        pyautogui.moveTo(entry_position, duration=0.7)
1 }7 V$ g6 f. w2 N# p( [2 K- s1 q        pyautogui.click(entry_position)8 z" v" W' [) v
        pyperclip.copy('快去睡觉')8 k: O0 }$ p7 B( _. Q# @
        pyautogui.hotkey('ctrl', 'v')
  L; {& w' u* o8 Y* Z        pyautogui.press('enter')
, ~! V. e0 J7 H% T4 T! T% G' ]    pyperclip.copy('笨猪')) Y8 b0 o( w* B# R! P1 ]
        pyautogui.hotkey('ctrl', 'v')
0 A' k8 Y" `1 D: s6 [        pyautogui.press('enter')8 H8 {0 h+ K, s' |  ^
    & l" S+ `. Q0 L( n$ U& }
scheduler = BlockingScheduler() # 实例化
  ~5 e6 a; I, H2 [* m( m8 tscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
# ~# Z! ?! J  j- ~: v- u5 Oscheduler.start()+ s4 W8 F% a! X7 G& u% ]' S
</code></pre>
! F! L# R/ W. Y& a! s+ g8 X<p>完成啦!现在可以去睡觉了。</p>, ^! u, y5 A* m4 j7 O
<h1 id="结果">结果</h1>
. d  L+ L+ A4 i, y. s+ R! ?+ h<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
" D, m! I4 K  D- A. {1 O8 B<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>5 D4 W: m% G* Y7 Y+ X! [$ b, P6 x( F
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>/ c7 ]1 n3 j. i  w# x
<hr>8 X8 J; K% f$ J% f, X( i
<h1 id="---the-end---">-- the End --</h1>- z- S7 k! g7 B! k0 L
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>% _9 R: o/ P3 m! j+ |9 l% b: x4 `, C
<p>打个小广告:作者CSDN博客主页:<br>. [! C+ U/ [5 B+ Y( `6 @* q; u
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>- y( r  c7 L0 n
% ]& m8 @( b( {
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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