飞雪团队

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

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

[复制链接]

8040

主题

8128

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

$ R) h  h* }! v9 r! c' [& S<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
) n+ j6 T, Z6 v. t- g8 P8 C<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
+ V$ L4 y5 K# Q* p不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>' u$ h& }) l. [& m% b' h
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
/ w. h$ A: \7 q5 I+ f但,女朋友的命令,我是不敢违抗的……<br>+ @" F5 N. J) C+ E8 y6 K
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>+ ?* h$ w8 r* L
但是睡觉也不能缺!</p>, s! P! U! q8 s
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>! L4 |9 S' P0 M3 h2 x# n. }
<h1 id="python登场">Python登场</h1>
* D9 A! l+ B& K! E( P<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>" O/ M8 `+ Z: t9 ^+ Y
<h2 id="安装和导入">安装和导入</h2>
6 Y3 U3 k& W! Y7 R' H* X) Q. l4 a+ W<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
" D. F$ d0 E, C* r4 S7 p* [<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
$ Q7 H7 ]: q" q& _. t  t<pre><code class="language-p">pip install apscheduler
6 b2 E: _0 Z) i: ]- t3 I5 m) Ipip install pyautogui
& V' t/ B: e5 o9 H( o/ H1 k</code></pre>7 d8 ?$ D, I9 |1 n$ N3 }
<p>导入:</p>& {/ H2 z* G: t7 R% K0 Z
<pre><code class="language-python">import pyautogui
" y# V4 X0 k. j0 n9 ~! Hfrom datetime import datetime- N$ h* }6 r3 U: ?! k2 x/ w
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器' L4 g3 u% ?& l8 c& W0 q8 G
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:+ z+ H( Y/ J! Y. z/ l) h3 R0 ~
# from apscheduler.schedulers.background import BackgroundScheduler
3 J4 T3 X- ?# Q/ p/ I</code></pre>
; l- r3 U3 Y3 R<h1 id="pyautogui">pyautogui</h1>
: Y+ a7 T! G' Q<p>首先我们来实现自动发送消息</p>/ s$ ]! h9 h8 V% @
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
2 [4 O$ p  T- w$ k  w3 l<p>先来做一些基本设置:</p>
9 V: @  h9 x% a  N<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
7 `/ B* c' Y  m6 q! B+ _( M/ U; x</code></pre>
2 p( P0 G( ]" N# g; Z7 g' z: E<p>然后我们登录微信,最小化。</p>
1 N' t8 R9 C+ u/ j2 h) J<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
- V% J+ C# Y/ {# z# O8 V$ V<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)- {6 G! f$ H- x: @, k
icon_position = pyautogui.position() # Point(x=148, y=879)
- k6 c9 M0 h8 W0 I, D</code></pre>
! J5 q, N: ?- v" {' o: b<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>; u4 I, X% Z6 ^* v0 n
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>" y( E, T/ _( d4 U1 k. K
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)# G+ S/ \: t% T! x, h
entry_position = pyautogui.position() # Point(x=174, y=751)
" h# z, P4 j5 c/ G% l: j! B5 b</code></pre>
# I. W" U' G/ `/ n" [/ M<p>接下来,控制程序依次点击这两个点:</p>
5 b6 p( q* Z6 j' f1 d0 s9 }# p<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击8 i6 L2 J0 E4 y# f1 i8 T: ]  \
# pyautogui.click(148, 879)
6 J' ~$ i8 Z: Z5 x3 A; Ipyautogui.click(entry_position)
& {( D4 a9 N. V2 y# pyautogui.click(174, 751)
! p8 _6 |  S) p; k3 M0 k/ A</code></pre>- c/ E! M7 y+ w/ P0 M( x3 [6 m( z
<p>打开微信并锁定焦点后,我们开始输入文本。</p>0 o/ z# X+ Q# v
<p>输入文本可以有两种方式:</p>3 b1 |2 s* s. T2 |+ J: C
<ul>6 q) L) K4 P) `+ ^4 c% Q8 n
<li>9 X, L8 m. c' i! R- B4 n
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
- S, J* v  k( X" P( U. D- H<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>8 f( x' S" |& i( f* C
</li>
4 R/ c# M! ~; P: q6 |0 f% L  D<li>
+ k* h+ L. \! u. r: s0 S<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
1 U0 L3 }8 M. @# H8 y<p>传入字符串,但不能同时打印字母和特殊按键。</p>
. N& O+ e; M# W! I, X</li>+ o( k- B# `: x6 S& c. Y- R
</ul>
* J& k  w1 F- X) O; O; G0 r, C# S% M<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
7 Q- B& s+ j/ i# p. i3 Q) [<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
9 x0 e7 F+ m3 ^& y</code></pre>* H2 v9 ]( S8 g. t
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>( X5 I9 A7 C8 U) w
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
7 W0 J4 [- S7 c* }4 B7 Q  Q* |pyautogui.click(icon_position)# g  |' F" @5 M3 c; k9 t
pyautogui.moveTo(entry_position, duration=2)/ c" I! r% ~+ G& C% Z
pyautogui.click(entry_position)+ o; N$ i! R; c+ Z
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
# a8 s! g6 ~; ~1 g- X* o</code></pre>
! n5 A4 J& G' |5 ^- ?9 s7 y<p>看看效果:<br>' l# G( v. \; G0 j& C- y6 ^- @
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
3 j9 ^3 Y! P5 z7 u! P当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
' E2 I; \( [/ _/ p9 t) k<pre><code class="language-python">import pyperclip  Q4 h: o& \' _, ~% [. o5 s

6 Q' w* v% O. q0 C' }pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
% ^. |2 \* e) L! o& Mpyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
' T$ c- X" `  a, g2 `3 x: Z) O: apyautogui.press('enter') # 按下按键
# X. @" D, P  S</code></pre>8 w: m/ l+ l9 l
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
) o- ~+ K, o" l( `+ Q0 R这样,我们便完成了自动发送微信消息的功能了。</p>" B  B' W3 n) {; U$ Z
<h1 id="apscheduler">apscheduler</h1>
/ x4 y% h9 ~% `6 H0 h$ ]# L, t; T<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>/ I, N$ k! h8 |! e1 a
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器  [6 C9 H) ^1 ^, |" D8 N
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
2 p; n$ d6 N) V; o/ W8 x3 w0 r% Jscheduler.start()* n! L4 e: m) L! z+ v6 U3 F
</code></pre>
+ e: i1 M5 C8 K0 T; W+ B<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>
2 Y: e2 l# l4 O9 q; q" i* s+ ^0 D<h1 id="完整代码">完整代码</h1>
+ G* H4 W% s& y, I5 S' @1 H<pre><code class="language-python">import pyautogui
% Z$ z$ V; \1 Aimport pyperclip; i2 B! b4 \/ ^- C4 j( H1 B
from datetime import datetime' e$ v: b- c& T; s/ M! b
from apscheduler.schedulers.blocking import BlockingScheduler
3 ~) Q. b# F" |( e% k8 p9 \2 l
4 v$ m) y# Y/ N. R* tdef main():2 h% V# b$ j- X
        pyautogui.PAUSE = 0
+ q! m3 [  i: G7 `
7 x4 q! O; _8 ^! O& y5 ]/ T9 O        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置* h& m4 d4 Y& c$ e9 F! {5 K! O
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置) e) F# b4 X8 ?
0 Z) x: L+ ~7 t5 w) d' D1 m
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选* i% f) U" r$ K4 _1 g- A( [
        pyautogui.click(icon_position)
$ c/ V: a4 F! T/ U" [        pyautogui.moveTo(entry_position, duration=0.7)+ ]! i' R6 M( C
        pyautogui.click(entry_position)9 k. D: k0 S# m6 F+ C& o$ @6 w: q* t
        pyperclip.copy('快去睡觉')
1 C& Z% `9 f- O+ I6 L& o        pyautogui.hotkey('ctrl', 'v')
- P! g+ J! n, q+ g9 K& E5 `* O" s        pyautogui.press('enter'); s% E& N7 g$ O' |. N$ P
    pyperclip.copy('笨猪'). g6 e$ l% h7 \( H5 B
        pyautogui.hotkey('ctrl', 'v')$ t% {6 u! ~. U1 G- B+ P
        pyautogui.press('enter')8 y; `5 [) ]% t' k, S/ J
   
* ~3 v' }. p+ U+ A7 b3 O! |; C3 fscheduler = BlockingScheduler() # 实例化
* s3 O" w1 b: }# Lscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
6 U+ B  s$ e" J$ P) H% u- C1 [scheduler.start(), E' }7 @6 p3 N0 C5 |
</code></pre>2 Z! X0 H+ p. F0 U4 O( M
<p>完成啦!现在可以去睡觉了。</p>
8 {  Q& d/ R7 }9 b9 u0 l. H<h1 id="结果">结果</h1>
8 w5 ]& i2 j* s0 i/ @0 R4 n2 d<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
$ y  {7 f# y& t' w<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br># C  R( v8 I* k1 }2 l
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
' k/ m; a5 x9 t<hr>0 }' ^% C2 D7 |, B: U' Q
<h1 id="---the-end---">-- the End --</h1>/ |/ Q/ ?9 D2 J$ a- O; N
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
' E; r5 p. t. k! R2 I<p>打个小广告:作者CSDN博客主页:<br>; ~( s* [1 w$ c; i! E, d: C+ v
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>) Q3 }9 M) c' _5 S8 P: q& f% s

3 ]/ W' t. ]  I# H' g7 I- e
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-12-6 16:43 , Processed in 0.064575 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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