飞雪团队

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

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

[复制链接]

4137

主题

4225

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14711
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
% V  c; E9 @! v: }# J1 ?0 g
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>& e8 A4 U* H& P; K9 K4 d
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
8 Y# G: M" Q$ |0 W不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
/ I( q0 o  N) o2 P<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>& C" t/ z$ [, |
但,女朋友的命令,我是不敢违抗的……<br>
6 G. l& y' _$ @8 ^) g% K<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
* m9 l5 N1 C2 {! a) l但是睡觉也不能缺!</p>" l) ^: S- P+ }1 B( j; |, g; q& H
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>* _+ H. Z$ Z/ ^4 U+ r6 D5 z3 S3 V. Q# g
<h1 id="python登场">Python登场</h1>7 D; @; m) {2 ]
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>' \( s0 A/ H3 U7 n# Z. ?( D0 O5 R
<h2 id="安装和导入">安装和导入</h2>. B0 J# Q, u% F0 s* w
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p># s. t3 ~( z9 F) j6 z/ A; G8 O
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
; N) B% l4 g, }! N- C$ u) Y. H<pre><code class="language-p">pip install apscheduler9 q) W: ^  {8 |* h+ I5 L, G
pip install pyautogui
4 }/ m% T6 C; W% p; r</code></pre>
$ N8 f7 w' K% J, w' {<p>导入:</p>1 X, c7 \  k1 q( y$ F4 n& ]4 j3 \
<pre><code class="language-python">import pyautogui
6 z, [) k6 Y# U- Sfrom datetime import datetime/ p" U. |# {% m: q
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
6 B2 h- _0 F+ S/ R# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:* B' S  S4 R  A
# from apscheduler.schedulers.background import BackgroundScheduler0 x% B: O5 \3 K
</code></pre>
+ B+ K0 x$ W3 W7 w2 l' X5 ]6 Y( D4 p<h1 id="pyautogui">pyautogui</h1>0 j4 E) Y* o. a- ~4 I
<p>首先我们来实现自动发送消息</p>
0 |7 `; D8 d; S  v! t. D<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>  E! Z; |) G) u+ g( I
<p>先来做一些基本设置:</p>
+ B& s1 D1 y# P2 m# ~8 l<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快- v/ g* Y( A! s- F1 a$ @. @
</code></pre>
. ]" e9 d% p5 ~5 n1 d' q6 [2 a<p>然后我们登录微信,最小化。</p>
* j* n# P" l8 {* L<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p># o# [) Y% S( L% @; g
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
! A: K' ?' A- a5 q! I) _icon_position = pyautogui.position() # Point(x=148, y=879)9 P: B& k; F9 {0 ?% c; j( \
</code></pre>5 G% J! b! j$ t2 `2 N2 V
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
) `+ \* X+ c* J<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
& Q6 u3 q* N# W, S' v<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
7 i' [9 @  z7 m, d9 v4 K% N9 r& lentry_position = pyautogui.position() # Point(x=174, y=751)
  \, l: i+ P* K: U( l</code></pre>% W7 x. w+ q& V
<p>接下来,控制程序依次点击这两个点:</p>
! B/ A5 P2 K/ {+ z<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击: T0 T& l4 }- m& I9 ?
# pyautogui.click(148, 879)7 n* N1 y: N4 g" Q
pyautogui.click(entry_position)
' n: i% `+ M5 J* J0 P+ l# pyautogui.click(174, 751)# q7 q) F  G/ i; `5 M  ^1 b- [
</code></pre>
3 j0 v5 V& Y2 K- Y8 ?<p>打开微信并锁定焦点后,我们开始输入文本。</p>5 c3 ^) {. R  X$ g
<p>输入文本可以有两种方式:</p>/ [( n4 P  S2 n3 P; }' b, O% |
<ul>5 H6 c' J- i5 Q% [, C
<li>  z+ H  i1 g/ m/ f$ K9 I- [
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
; z, h% ^$ ~; |/ e: }<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>. ^2 {' B- i/ ?: {7 T9 L! R
</li>
- J; R; H% y) \6 s<li>
. v. h  Y9 [5 v$ ]; [' V+ ^4 B<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>: I  d! {/ z8 A  @
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
9 I) t( c. T) l</li>4 w) w  `* N- E, N) D, Z8 S
</ul>* R; ]  |+ F, J! v+ m# p
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
9 |! k) j9 |' x: r9 j, L<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间' O4 |) T) A, l1 D6 |# l. ^7 _
</code></pre>+ ]* U3 A* a) v! h- D
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
7 {4 [  s, |2 o/ o- K; k' y1 Q<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
6 m) x4 H. j' Zpyautogui.click(icon_position)1 S- n5 p" P; v
pyautogui.moveTo(entry_position, duration=2)9 o7 g" n0 x) l6 Q6 {
pyautogui.click(entry_position)3 ^% c" r+ i9 y- `$ ]: x( ]
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
7 I& _/ I, A4 N7 [$ ?  U</code></pre>
# H* i- x0 r$ {5 x9 x3 V0 e<p>看看效果:<br>
, u+ M& p' x! C/ l6 I) ^5 j<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
/ L. }5 e8 h9 b. U+ K+ f当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>' Z9 Q; ?& V4 g$ _  [2 r% C( o# ?
<pre><code class="language-python">import pyperclip3 M6 d; [6 z( `# N! \: m
& H9 {% S: B0 m; @" B
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
& C) R; R5 W& V3 H( ~% hpyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
! k. Q" n. x$ _6 W1 B7 cpyautogui.press('enter') # 按下按键# G9 }9 R6 |. K
</code></pre>
3 Y$ A2 r+ m% b/ s<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
" u3 a- l' D" r: n1 X8 B5 [这样,我们便完成了自动发送微信消息的功能了。</p>+ _/ r. J5 `3 ^
<h1 id="apscheduler">apscheduler</h1>
! Z$ ]' E2 @; t1 D! v<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>/ M, I' Q' D3 l0 E5 ~
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
( M, M# `6 ^) ]  h- h3 Tscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务" I3 t$ d* N& b( @3 @/ T7 u
scheduler.start()0 l2 O; e% J% ^3 S7 q- `
</code></pre>3 ^6 n% ~5 ?) i1 m- w
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>7 \+ g, d* x0 x. c! {0 E4 Q
<h1 id="完整代码">完整代码</h1>, Y. e! `) A8 F+ d9 I6 t% |( {( a
<pre><code class="language-python">import pyautogui
% p6 u0 \! ^1 t$ a. |6 Iimport pyperclip% K- Q8 H7 O) o+ ^. H. ^6 H
from datetime import datetime; k! R1 q8 w2 ~$ v* h
from apscheduler.schedulers.blocking import BlockingScheduler+ G9 \+ M9 r$ r; g3 U6 d- M

- C3 w1 V5 I8 K0 m7 L) t1 V+ }1 Adef main():# ^2 T/ l( X$ X& q
        pyautogui.PAUSE = 0" f  {2 N* `" C- N% e
  v* {9 v- x5 ^% x# a; F
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置3 I7 P$ t  _; c
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置. E# F& [1 w% a

, w0 R1 p! S$ M# }# W1 p        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选0 Q1 d8 I( W) l' ~$ M" c+ Q
        pyautogui.click(icon_position)
, f  l) \* t) |: w, `- d        pyautogui.moveTo(entry_position, duration=0.7)& U+ x8 X+ X( b# q/ l, U& t" [9 g
        pyautogui.click(entry_position)
3 k* i$ j( j. Q, h+ h5 H        pyperclip.copy('快去睡觉')# k" K. `$ M& O! q9 I, y8 e8 ]
        pyautogui.hotkey('ctrl', 'v'): K8 E7 r. q) f4 e! K
        pyautogui.press('enter')6 ~% J- A# E  O2 K  ~
    pyperclip.copy('笨猪')
8 g+ x) U* i0 y" y& c3 t' B        pyautogui.hotkey('ctrl', 'v')
6 X# ^+ \: m, @9 j! i9 X! X        pyautogui.press('enter')3 }! m7 O# O, C) h% |2 b
   
# n! I+ ]! z9 s& W) Nscheduler = BlockingScheduler() # 实例化2 X# N- D2 o7 I9 ]5 A  P( C
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务  W( `# a/ d5 F4 _
scheduler.start()
. }) [3 g8 u% j</code></pre>  g' I& z9 b6 e. v" ~' v
<p>完成啦!现在可以去睡觉了。</p>6 n# B, y7 q( S' X: k9 Y1 x! o
<h1 id="结果">结果</h1>
' y0 G0 F! V! R: s; S<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>4 c! e1 ~- k' Y# a4 y
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
) y" o8 }7 A8 _<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
* C  s  b+ k& f0 F* n+ q<hr>
. k' O1 N9 t% @5 @6 C) h7 _<h1 id="---the-end---">-- the End --</h1>
# j- A' V' G  i  o# H  V3 X<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>5 L0 g( {, l1 o) f- F' K% Q7 [! g
<p>打个小广告:作者CSDN博客主页:<br>
+ u5 {. j+ J* D; }<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
4 n" V( h  r6 ?1 X8 F2 _6 `9 ~
, c1 i, v8 v; m1 r* O: \
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2024-4-26 14:06 , Processed in 0.064999 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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