飞雪团队

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

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

[复制链接]

8053

主题

8141

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26489
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
6 r7 R+ j1 h4 ~# }0 i- y) [  j
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>1 l. W  V6 p- i9 r% ?; Z
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>
) Q" `1 `3 i: w' ~不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>- r) S. i, f$ y' w6 }
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>3 |+ u- ?) w0 v6 [7 w0 P8 }
但,女朋友的命令,我是不敢违抗的……<br>
' p& V% z$ O! T8 N4 ~9 F8 H* g<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
8 x# S! F6 k$ Y' H7 ?/ `但是睡觉也不能缺!</p>6 l  i) h6 E4 ~9 x
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
6 {" g9 m/ j& m3 T<h1 id="python登场">Python登场</h1>/ P1 [6 w  J0 |5 b% ~5 h) g
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
# k/ W/ B; h7 f! B: d9 n, g& q<h2 id="安装和导入">安装和导入</h2>3 d) H3 ]* d& y0 M5 o2 I
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>- Q1 U( t2 y+ ]+ {: D
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>- q0 Z& F  q5 t6 L2 F
<pre><code class="language-p">pip install apscheduler5 |% }! Q& v2 |* A- S/ b4 m, Z) m# _. }, j
pip install pyautogui
  T  i) ]* X3 S* K$ o* z</code></pre>
! A" L5 J4 q( f; c3 O<p>导入:</p>
6 z' v8 h2 w& I5 |7 D% X$ E* _" ^<pre><code class="language-python">import pyautogui
  B+ T' E2 |  F) x8 |* Zfrom datetime import datetime
  A- i$ Y. }0 n7 A4 cfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
; J% O, A1 f9 z9 b: P# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:% N* N6 H) p% }) v: y( `7 e, d, G
# from apscheduler.schedulers.background import BackgroundScheduler
+ r5 }: V$ W% O$ ^5 P' m! R: n</code></pre>! o3 x* \2 C* I& u
<h1 id="pyautogui">pyautogui</h1>
. e3 J) e, x, D) ~; L2 j<p>首先我们来实现自动发送消息</p>, G) a. m/ I0 t
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
+ s* n/ U& [1 c7 j+ ]9 H<p>先来做一些基本设置:</p>. F4 J7 m# C' o
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快* |3 Q, r1 |7 o  O, k
</code></pre>6 F' j! p& q$ `: c$ t; M
<p>然后我们登录微信,最小化。</p>+ _3 j3 h, f; U9 k
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>7 v) l, q9 Z: ?: Y& Z
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
# I- b  t8 p$ c* P, J/ D1 Hicon_position = pyautogui.position() # Point(x=148, y=879)
7 \/ S; c6 L- D: ]# F! W( m</code></pre>
; |& C8 u  e1 U8 G) r; _0 \<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
/ t( z3 L; L% d' A<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
. V* W1 R6 m  j0 _& d7 w<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)% y  }0 J# K% A
entry_position = pyautogui.position() # Point(x=174, y=751)
3 d6 r0 R! d% I  z</code></pre>
3 ?6 j& d5 v( b( E# U# O8 W<p>接下来,控制程序依次点击这两个点:</p>
/ [' B: m# i# I8 ?, |<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击+ I7 X8 w# Z( P% K7 R  ?
# pyautogui.click(148, 879)
6 z- |% f2 i) R# Rpyautogui.click(entry_position)
  P- w1 J. M  K" N- p' [# X2 p( s# pyautogui.click(174, 751)0 p, L' z9 w( y1 K. h" z1 g9 B+ v
</code></pre>; K; N9 ~0 c! i3 }, P, e# b
<p>打开微信并锁定焦点后,我们开始输入文本。</p>7 ~1 U! H/ q. \3 C
<p>输入文本可以有两种方式:</p>% U- X7 ?, Y. [$ M7 }( Z
<ul>, D- c7 v$ e9 a# V
<li>
5 N: V) p5 l+ G3 p2 l. i<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>3 m5 \2 R) g  \8 j* _# t) j4 l
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>9 d/ i, g! O  c( W( h
</li>, r) e* N! K' Q1 u/ d+ r
<li>) v; _% d! n2 U0 ?! w1 p4 F
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
  p0 Z' ]3 E* o* F/ m<p>传入字符串,但不能同时打印字母和特殊按键。</p>" S1 V4 C9 @; A. A! R# C" h( L
</li>0 s1 A' L9 M/ D/ Z8 S- @5 P
</ul>
: @' `4 L* Z6 Y# e: D, ~<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>* M$ W4 V; Y8 z$ K1 u8 t
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
% }+ y1 N1 N4 x* M</code></pre>
9 ~; b: B$ \4 }" R' o  k9 _8 y/ x<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>: V9 [% i2 C+ q$ o( p" z8 _
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
7 e7 u6 X( n% b8 \pyautogui.click(icon_position)
; d1 l" R9 j$ I3 [4 A7 L+ d0 B. Rpyautogui.moveTo(entry_position, duration=2)- S3 `* W; h& U* w- b9 g
pyautogui.click(entry_position)
/ O2 v0 l7 C* L& \6 Zpyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选' Y1 ^# t% f# k3 ?3 l( b
</code></pre>
3 L+ K* A/ u1 i' ~3 i& O. n<p>看看效果:<br>, {- u9 `5 I9 e7 Q
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>6 X. v, K# K! F! G' Z! v& x, \
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>! k/ }2 L: K# S6 H; B2 q+ J0 V
<pre><code class="language-python">import pyperclip
" |3 @) p+ j1 v& e, X9 c5 c; ~* }
. D1 V  P0 R* z7 P. _1 g* mpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制% p( x, @( Q+ U- H
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴5 l) N! ?1 G" E9 w5 T, I
pyautogui.press('enter') # 按下按键
: v; S& j; h0 l5 Y+ R: W( K: Q# B1 E</code></pre>
5 F4 E4 r  \! K6 N<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br># y) Z; K. [( V* {  P& [+ |; j
这样,我们便完成了自动发送微信消息的功能了。</p>7 L* f6 G. A$ u% {  l/ c
<h1 id="apscheduler">apscheduler</h1>+ n: c6 ^# G4 N( @$ P% J( q
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
# c7 o# d- E; x. i' \8 |<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
8 _$ W/ z$ z1 @; N7 l* kscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务4 L* V& {# B2 C$ e: I: l
scheduler.start()
) j/ X# E$ s; B( V5 ]2 ^( u</code></pre>
$ b; q  T* f" I, l* o* H# q: Q3 B<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>* m1 S! _3 d! X3 d, @
<h1 id="完整代码">完整代码</h1>
% J0 b: b$ U! x<pre><code class="language-python">import pyautogui
/ [& P- ^# s% iimport pyperclip/ Y' ~: z; N* p2 i
from datetime import datetime
5 m- \2 b% m  a8 U! qfrom apscheduler.schedulers.blocking import BlockingScheduler% G0 T; T1 x/ w% c3 k/ S- I

% ]7 D9 E1 A: Q, g! Idef main():; P' J3 F5 l, e) o/ i& Z
        pyautogui.PAUSE = 0
# [% b. p) `* \, A4 u/ G, M/ S; `) u0 ^$ g: C! G- I. r' F
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置) W! k# |# N4 p& ~3 A
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置+ y( u* A3 E$ V4 U) O: c( X, Q

! n9 w% q5 W8 l2 u8 p8 i9 ]        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
  F, X) G6 e" F9 r, \        pyautogui.click(icon_position)( L; i* r) @, n9 y6 z' a$ z+ K
        pyautogui.moveTo(entry_position, duration=0.7)
7 }+ ^5 f  N% w, C        pyautogui.click(entry_position)
" i5 f+ a4 \) b        pyperclip.copy('快去睡觉'). L: F' ^* _; r; {
        pyautogui.hotkey('ctrl', 'v')
, Z: K1 T8 D. t" `        pyautogui.press('enter')
( ?: d( ?$ r2 j! ]' c: Z" [6 B4 m    pyperclip.copy('笨猪')
+ {$ p( `1 R' X- D; |/ i8 O- F        pyautogui.hotkey('ctrl', 'v')8 e7 \$ i! k+ }& L2 S
        pyautogui.press('enter')  Y9 E6 w3 y) S# e9 `) X# m9 I
   
# Z4 m$ I5 }/ [, G" j  q$ Wscheduler = BlockingScheduler() # 实例化
& A1 Q& R- `+ o. V6 hscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务! M" w. w0 d' N; M6 }+ w  K0 m  b
scheduler.start()
: c6 o( f$ W+ y' B) N1 A</code></pre>
+ o/ y) G- \2 y: @6 w) R( S<p>完成啦!现在可以去睡觉了。</p>
: L9 `! ~6 T' I+ S$ o) q  c* L<h1 id="结果">结果</h1>. k% v9 f, p) v1 j
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>7 n2 y  S- Q" ]
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>( K; P' a: @8 e% a& q/ o  w$ i
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>, f3 d5 f6 S9 ?
<hr>3 G' f5 P3 r3 K
<h1 id="---the-end---">-- the End --</h1>
# D, S+ o" o1 G) E6 i& T2 d6 {2 L<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
8 Y) s# V* h  W) a/ ?<p>打个小广告:作者CSDN博客主页:<br>
) T3 U. g  b$ Q* |1 d<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>" C; Z  Y% x2 ?/ D

0 C  v6 L/ d& B9 ?2 y7 R% X
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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