3

使用bash随机更换壁纸

 3 years ago
source link: https://www.lujun9972.win/blog/2018/04/24/%E4%BD%BF%E7%94%A8bash%E9%9A%8F%E6%9C%BA%E6%9B%B4%E6%8D%A2%E5%A3%81%E7%BA%B8/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用bash随机更换壁纸

本文要做的事情是写一个脚本,用来随机地从 redditwallpapers 中挑选一张壁纸应用到卓面上。

wget下载URL和壁纸图片 grep从URL中抽取指向壁纸的URL feh设置壁纸到桌面上 shuf产生随机效果

壁纸的来源

为了简便处理,我们只从 https://www.reddit.com/r/wallpapers/ 的第一页中随机选取壁纸。

用浏览器打开 https://www.reddit.com/r/wallpapers/ 你就会发现它列出了最新产生的25个帖子。

screenshot-47.png

点开帖子就会显示出具体的壁纸内容来 screenshot-48.png

所以我们要做的其实就是下面几步:

  1. https://www.reddit.com/r/wallpapers/ 中抽取出帖子的链接
  2. 随机选择一个帖子链接
  3. 找出帖子链接中图片的URL
  4. 下载并设置壁纸

https://www.reddit.com/r/wallpapers/ 中抽取出帖子的链接

首先让我们用 wget 下载 https://www.reddit.com/r/wallpapers/ 页面来分析一下该如何抽取出帖子的链接呢。

wget  https://www.reddit.com/r/wallpapers -O -

这条命令会下载 https://www.reddit.com/r/wallpapers/ 页面然后将内容显示在标准输出中。

由于内容太多,这里就不列出具体的内容了。我们先把网页中所有的链接过滤出来看看都有哪些内容.

wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |sort |uniq
href="/"
href="http://redditgifts.com/"
href="http://s1.1zoom.me/b5555/619/Ireland_Castles_Trim_castle_Night_Shrubs_538153_2560x1440.jpg"
href="https://about.reddit.com"
href="https://about.reddit.com/advertise/"
href="https://about.reddit.com/careers/"
href="https://about.reddit.com/press/"
href="https://i.imgur.com/0eSNAHv.jpg"
href="https://i.imgur.com/3tPGErY.jpg"
href="https://i.imgur.com/hs7OcfD.jpg"
href="https://i.imgur.com/pIYPQQZ.jpg"
href="https://imgur.com/a/qLnxOv1"
href="https://imgur.com/a/zR2iLXL"
href="https://reddit.com/message/compose?to=/r/wallpapers"
href="https://www.reddit.com/gold/about"
href="https://www.reddit.com/help/contentpolicy"
href="https://www.reddit.com/help/healthycommunities/"
href="https://www.reddit.com/help/privacypolicy"
href="https://www.reddit.com/help/useragreement"
href="https://www.reddit.com/login?redirect=https%3A%2F%2Fwww.reddit.com%2Fr%2Fwallpapers%2F"
href="https://www.reddit.com/mobile/download"
href="https://www.reddit.com?redirect=https%3A%2F%2Fwww.reddit.com%2Fr%2Fwallpapers%2F"
href="https://www.reddit.com/register?redirect=https%3A%2F%2Fwww.reddit.com%2Fr%2Fwallpapers%2F"
href="https://www.reddit.com/r/wallpapers/"
href="https://www.reddit.com/r/wallpapers/?after=t3_8e2rq7"
href="https://www.reddit.com/r/wallpapers/comments/8e2rq7/rush_downtown_thebadbadben_2732x1536/"
href="https://www.reddit.com/r/wallpapers/comments/8e7k5i/ghost_in_the_shell/"
href="https://www.reddit.com/r/wallpapers/comments/8eaglp/tripy_leaf_wallpaper_edited_from_an_unsplash_image/"
href="https://www.reddit.com/r/wallpapers/comments/8eapkd/beautiful_purple_sunset_1920x180/"
href="https://www.reddit.com/r/wallpapers/comments/8ebjj0/credit_to_whoever_took_this_picture_i_forget/"
href="https://www.reddit.com/r/wallpapers/comments/8ebyo5/another_whale_seen_in_the_sky_2880x1800/"
href="https://www.reddit.com/r/wallpapers/comments/8ebyvm/snowy_hills_3840_2160/"
href="https://www.reddit.com/r/wallpapers/comments/8edl5j/vaporwave_hills_3840x2160/"
href="https://www.reddit.com/r/wallpapers/comments/8efq4z/3d_city_glitch_1920x1080/"
href="https://www.reddit.com/r/wallpapers/comments/8eica4/my_cat/"
href="https://www.reddit.com/r/wallpapers/comments/8eiuhx/imperial_walkers_dawn_darek_zabrocki_3235x1820/"
href="https://www.reddit.com/r/wallpapers/comments/8ej0ev/kratos_1366x768/"
href="https://www.reddit.com/r/wallpapers/comments/8ej8np/in_the_woods_the_blue_gloom_m_yakovlev_4373x2460/"
href="https://www.reddit.com/r/wallpapers/comments/8ek3ab/sr71_amidst_the_sunset_3072x1728/"
href="https://www.reddit.com/r/wallpapers/comments/8ekaf2/tokyo_rose_vice_2412x1357/"
href="https://www.reddit.com/r/wallpapers/comments/8ekb2n/another_personal_favorite_cerebrum_by_tomasz/"
href="https://www.reddit.com/r/wallpapers/comments/8ekqe8/zettai_ryouiki_outrun_a_sr71_colonel_cbplayer/"
href="https://www.reddit.com/r/wallpapers/comments/8ekwjg/boardwalk_1920_1080/"
href="https://www.reddit.com/r/wallpapers/comments/8elgzr/venom_1688x1076/"
href="https://www.reddit.com/r/wallpapers/comments/8enilg/lighthouse_2560x1440/"
href="https://www.reddit.com/r/wallpapers/comments/8ep7de/trim_castle_ireland_2500_x_1440/"
href="https://www.reddit.com/r/wallpapers/comments/8epjah/nekopara_vol_0_sfw_1920x1202/"
href="https://www.reddit.com/r/wallpapers/comments/8er6uk/apollo_17_earths_moon_2560x1440/"
href="https://www.reddit.com/r/wallpapers/comments/8ess6s/planet_surfaces/"
href="https://www.reddit.com/r/wallpapers/comments/8et1sk/stars_space_galaxy_1920x1080/"
href="https://www.reddithelp.com"
href="https://www.redditstatic.com/desktop2x/Commons.a1e39474b980de9725ef.js"
href="https://www.redditstatic.com/desktop2x/fonts/IBMPlexSans/Medium-c4b185e25a4dde85a29f902cd5ce5360.woff2"
href="https://www.redditstatic.com/desktop2x/fonts/IBMPlexSans/Regular-116bb6d508f5307861d3b1269bc597e7.woff2"
href="https://www.redditstatic.com/desktop2x/img/favicon/android-icon-192x192.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-114x114.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-120x120.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-144x144.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-152x152.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-180x180.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-57x57.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-60x60.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-72x72.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-76x76.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/favicon-16x16.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/favicon-32x32.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/favicon-96x96.png"
href="https://www.redditstatic.com/desktop2x/img/favicon/manifest.json"
href="https://www.redditstatic.com/desktop2x/overlap-2c2efe7e95ba8fc991854e8f01322243.575c42d246b39a3a03e6.js"
href="https://www.redditstatic.com/desktop2x/overlap-44e3d536a182a3fe6c9eed5014e47b05.08362281f54b63e55856.js"
href="https://www.redditstatic.com/desktop2x/overlap-617df21ac848fad21f5733296c4f91a1.e7da3e4bc28c59fb8ef1.js"
href="https://www.redditstatic.com/desktop2x/overlap-9fc0f7a006faf347e6dc6a1670421fb0.6d15f53ff4128ba2c408.js"
href="https://www.redditstatic.com/desktop2x/overlap-de8e488af5f659d52a5c321db16a89a5.f1cd898dc044a4d81f48.js"
href="https://www.redditstatic.com/desktop2x/overlap-fc592e99099d1804afeb090c87b920c0.6a46ccff54a4bc09e93c.js"
href="https://www.redditstatic.com/desktop2x/ProductionVendorAux.b93c16e76c66f5775359.js"
href="https://www.redditstatic.com/desktop2x/ProductionVendor.f98cdff1b7e8856c5548.js"
href="https://www.redditstatic.com/desktop2x/Reddit.3ae165fca313f57c16bb.js"
href="http://www.redditblog.com/"
href="/r/all"
href="/r/popular"
href="/r/wallpapers/"
href="/r/wallpapers"
href="/r/wallpapers/comments/8e2rq7/rush_downtown_thebadbadben_2732x1536/"
href="/r/wallpapers/comments/8e7k5i/ghost_in_the_shell/"
href="/r/wallpapers/comments/8eaglp/tripy_leaf_wallpaper_edited_from_an_unsplash_image/"
href="/r/wallpapers/comments/8eapkd/beautiful_purple_sunset_1920x180/"
href="/r/wallpapers/comments/8ebjj0/credit_to_whoever_took_this_picture_i_forget/"
href="/r/wallpapers/comments/8ebyo5/another_whale_seen_in_the_sky_2880x1800/"
href="/r/wallpapers/comments/8ebyvm/snowy_hills_3840_2160/"
href="/r/wallpapers/comments/8edl5j/vaporwave_hills_3840x2160/"
href="/r/wallpapers/comments/8efq4z/3d_city_glitch_1920x1080/"
href="/r/wallpapers/comments/8eica4/my_cat/"
href="/r/wallpapers/comments/8eiuhx/imperial_walkers_dawn_darek_zabrocki_3235x1820/"
href="/r/wallpapers/comments/8ej0ev/kratos_1366x768/"
href="/r/wallpapers/comments/8ej8np/in_the_woods_the_blue_gloom_m_yakovlev_4373x2460/"
href="/r/wallpapers/comments/8ek3ab/sr71_amidst_the_sunset_3072x1728/"
href="/r/wallpapers/comments/8ekaf2/tokyo_rose_vice_2412x1357/"
href="/r/wallpapers/comments/8ekb2n/another_personal_favorite_cerebrum_by_tomasz/"
href="/r/wallpapers/comments/8ekqe8/zettai_ryouiki_outrun_a_sr71_colonel_cbplayer/"
href="/r/wallpapers/comments/8ekwjg/boardwalk_1920_1080/"
href="/r/wallpapers/comments/8elgzr/venom_1688x1076/"
href="/r/wallpapers/comments/8enilg/lighthouse_2560x1440/"
href="/r/wallpapers/comments/8ep7de/trim_castle_ireland_2500_x_1440/"
href="/r/wallpapers/comments/8epjah/nekopara_vol_0_sfw_1920x1202/"
href="/r/wallpapers/comments/8er6uk/apollo_17_earths_moon_2560x1440/"
href="/r/wallpapers/comments/8ess6s/planet_surfaces/"
href="/r/wallpapers/comments/8et1sk/stars_space_galaxy_1920x1080/"
href="/r/wallpapers/controversial/"
href="/r/wallpapers/hot/"
href="/r/wallpapers/new/"
href="/r/wallpapers/rising/"
href="/r/wallpapers/submit"
href="/r/wallpapers/top/"
href="/user/acoolrocket"
href="/user/Aileos"
href="/user/Arcade23"
href="/user/BradFMB"
href="/user/campymountain"
href="/user/Clinicalyabrasiv"
href="/user/CreamSodaFloat"
href="/user/Donutsen"
href="/user/douglasrcjames"
href="/user/emem01"
href="/user/hero0fwar"
href="/user/KorvisKhan"
href="/user/MrAwkwardCrotch"
href="/user/nothingsaidalice"
href="/user/pakaau"
href="/user/PiekarnikCiepla"
href="/user/pmaxm00"
href="/user/sequence_string"
href="/user/T3DS"
href="/user/T-D-S"
href="/user/ThatOnePhotog"
href="/user/thmanwithnoname"
href="/user/thmodwithnoname"
href="/user/xypnox"
href="/user/zaron5551"

你会发现结果中包含了很多乱七八糟的链接。我们还有必要做进一步的过滤。

通过分析这些帖子的URL,可以看出它们都是以 https://www.reddit.com/r/wallpapers/comments 开头的。 因此我们试着用 grep 将符合这个条件的URL过滤出来看看效果怎么样

wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/'

过滤结果非常好!

随机选择一个链接

要随机选择链接,我们可以使用 shuf 命令来打乱链接的顺序,然后选择第一个链接作为我们要访问的链接就行了

wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/' |shuf -n 1

找出帖子链接中图片的URL

按照之前的方法,我们来看看帖子链接中都有哪些链接。不过由于我们只需要图片,因此可以加个限制只显示包含 .jpg, .jpeg, 或者 .png 的URL.

url=$(wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/' |shuf -n 1)
wget ${url} -O - |grep -o -E 'href="([^"#]+)"' |grep -E "\.jpg|\.jpeg|\.png"

其中 redditstatic 中的图片是reddit本身的那些图片,而 resi.ze=robot.com 中的图片是提供下载的不同尺寸的地址,我们过滤掉这两个地址

url=$(wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/' |shuf -n 1)
wget ${url} -O - |grep -o -E 'href="([^"#]+)"' |grep -E "\.jpg|\.jpeg|\.png" |grep -v -E "www.redditstatic.com|resi.ze-robot.com"

还可能剩下多张图片,我们再用 shuf 来随机选择其中一张

url=$(wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/' |shuf -n 1)
wget ${url} -O - |grep -o -E 'href="([^"#]+)"' |grep -E "\.jpg|\.jpeg|\.png" |grep -v -E "www.redditstatic.com|resi.ze-robot.com" |shuf -n 1

我们把URL从 href 中抽取出来

url=$(wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/' |shuf -n 1)
wget ${url} -O - |grep -o -E 'href="([^"#]+)"' |grep -E "\.jpg|\.jpeg|\.png" |grep -v -E "www.redditstatic.com|resi.ze-robot.com" |shuf -n 1 |grep -o -E 'http[^"]+'

下载并设置壁纸

我们使用wget来下载壁纸,并通过feh来设置壁纸。

不过有一点需要注意的是,我们上一步中假设壁纸是以 .jpg, .jpeg, 或者 .png 结尾的。 那如果壁纸不是以这三个后缀结尾怎么办?一个简单的办法就是重新再随机选择一次。

#!/bin/bash

function get_image_url()
{
    url=$(wget  https://www.reddit.com/r/wallpapers -O - |grep -o -E 'href="([^"#]+)"' |grep -o -E 'https://www.reddit.com/r/wallpapers/comments/[^"]+/' |shuf -n 1)
    wget ${url} -O - |grep -o -E 'href="([^"#]+)"' |grep -E "\.jpg|\.jpeg|\.png" |grep -v -E "www.redditstatic.com|resi.ze-robot.com" |shuf -n 1 |grep -o -E 'http[^"]+'
}

image_url=$(get_image_url)

while [[ -z "${image_url}" ]];do
    image_url=$(get_image_url)
done

wget ${image_url} -O - |feh --bg-scale -

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK