- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 PHP 编写一个小模块,它将向我的客户发送电子邮件(使用 PHPMailer)。
我不想将大文件附加到这些电子邮件中,而是发布一个下载文件的链接(压缩)。
这些文件存储在 DSM6.x 下的 Synology 中。
有没有办法通过 SSH 中的命令行指向所需文件并使用 Synology 说明生成 gofile.me 链接?
谢谢
最佳答案
这可以通过 Synology REST API .
虽然这可能不是您想要的,但这里有一个用于创建 gofile.me
的 Python 3 脚本。来自命令行的链接。不幸的是,我在互联网上找不到任何简单的工作解决方案,所以我自己写了它。希望这会有所帮助(see also my Github repo)。
#=========================================================================
# SynoShare.py (c) Ded, 2020
#=========================================================================
#
# Creates a public http://gofile.me link for path/file located on Synology server.
#
# Usage: SynoShare.py <path / filename_to_share> [--debug]
#
# Copyright (c) 2020. Ded (Ilya Dedinsky, mail@ded32.ru)
#=========================================================================
from __future__ import print_function;
import requests;
import json;
import traceback;
import sys;
import os;
#-------------------------------------------------------------
# These values are imported from OS environment variables to avoid exposing of private data:
#
# SynoShareNAS - Synology NAS IP or DNS name
# SynoShareAccount - Synology NAS Account used for creating links
# SynoSharePasswd - Synology NAS Account password
#
# Set these variables BEFORE calling this script. They may be crypted, see below.
#
# NOTE: This script contains Decode() function for decoding login data, which may be crypted.
# Now this function works transparently, simply returning its parameters. You can update this
# function to support your scheme of encrypting login credentials.
#-------------------------------------------------------------
NAS = str (os.getenv ("SynoShareNAS"));
Account = str (os.getenv ("SynoShareAccount"));
Passwd = str (os.getenv ("SynoSharePasswd"));
#-------------------------------------------------------------
# Exit codes of the script
#-------------------------------------------------------------
LinkCreated = 0;
LinkExists = 1;
LinkNotCreated = 2;
FatalError = 3;
SyntaxError = 255;
#-------------------------------------------------------------
Sid = "";
Debug = False;
if (len (sys.argv) >= 3): Debug = (sys.argv[2] == "--debug");
#-------------------------------------------------------------
def main():
_("", "main()");
global Debug;
if (len (sys.argv) >= 3): Debug = (sys.argv[2] == "--debug");
file = "";
if (len (sys.argv) >= 2): file = sys.argv[1];
if (file == ""):
eprint ("ERROR: Usage: " + sys.argv[0] + " <path/filename to share> [--debug]");
return SyntaxError;
if (NAS == "None" or Account == "None" or Passwd == "None"):
eprint ("ERROR: SynoShareNAS, SynoShareAccount or SynoSharePasswd environment variable(s) NOT found");
return SyntaxError;
DoAuth (Account, Passwd);
list = SharingList();
links = list["data"]["links"];
total = list["data"]["total"];
for (link) in (links):
if (link["path"] == file):
url = _(link["url"], "url");
eprint ("EXISTS:", url);
print (url);
return LinkExists;
url = "";
link = _(SharingCreate (file), "link");
if (link["success"] == True):
url = _(link["data"]["links"][0]["url"], "url");
eprint ("CREATED:", url);
print (url);
return LinkCreated;
else:
eprint ("NOT created:", '"' + file + '"');
return LinkNotCreated;
#=========================================================================
def GetApiInfo():
_("\n", "GetApiInfo()");
return _(Get ("query.cgi?api=SYNO.API.Info&version=1&method=query&query=SYNO.API.Auth,SYNO.FileStation"), "GetApiInfo");
#-------------------------------------------------------------------------
def DoAuth (account, passwd):
_("\n" + "account = " + account + ", passwd = " + passwd, "DoAuth()");
try:
account = Decode (account);
passwd = Decode (passwd);
res = _(Get ("auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=" + account + "&passwd=" + passwd + "&session=FileStation&format=sid"), "DoAuth()");
global Sid;
Sid = res["data"]["sid"];
return _(Sid, "DoAuth(): Sid");
except Exception as e:
raise Exception ('DoAuth(): Cannot auth in "' + NAS + '":\n ' + str (e));
#-------------------------------------------------------------------------
def SharingList():
_("\n", "SharingList()");
return _(Get ("entry.cgi?api=SYNO.FileStation.Sharing&version=3&method=list"), "DoSharing");
#-------------------------------------------------------------------------
def SharingCreate (path):
_("\n" + "path = " + path, "SharingCreate()");
return _(Get ('entry.cgi?api=SYNO.FileStation.Sharing&version=3&method=create&path="' + path + '"'), "DoSharing");
#=========================================================================
def Get (request):
_("\n" + "request = " + request, "Get()");
if (Sid != ""): request += "&_sid=" + Sid;
res = _(requests.get (_("http://" + NAS + "/webapi/" + request, "GET")), "GET");
if (res.status_code != 200): raise Exception ("Get (" + request + "): Bad status " + str (res.status_code) + ":\n " + res.text);
res = json.loads (res.text);
if (not res["success"]): raise Exception ("Get (" + request + "):\n" + " Error: " + StrError (res["error"]["code"]));
return _(res, "GOT");
#-------------------------------------------------------------------------
def StrError (code):
errlist = { 400: "No such account or incorrect password",
401: "Account disabled",
402: "Permission denied",
403: "2-step verification code required",
404: "Failed to authenticate 2-step verification code",
2000: "Sharing link does not exist",
2001: "Cannot generate sharing link because too many sharing links exist",
2002: "Failed to access sharing links" };
return str (code) + ": " + errlist.get (code, "Unknown error");
#-------------------------------------------------------------------------
def Decode (str):
_("str = " + str, "Decode()");
# TODO: add some transformation code here to avoid expose your account name and passwd
return str;
#=========================================================================
def _ (data = "", name = ""):
if (not Debug): return data;
if (str (data) [0:1] == "\n"): data = data[1:]; eprint();
if (name != ""): eprint (name, ": ", sep = "", end = "");
if (data != ""): eprint ('"', data, '"', sep = "");
else: eprint();
return data;
#-------------------------------------------------------------------------
def eprint (*args, **kwargs):
print (*args, file = sys.stderr, **kwargs);
#=========================================================================
try:
sys.exit (main());
except Exception as e:
eprint ("ERROR: " + str (e));
if (Debug): eprint ("\n" + traceback.format_exc());
sys.exit (FatalError);
#=========================================================================
关于synology - 通过命令行获取 gofile.me - Synology,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59680988/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一系列 SQL 命令,我想在大约 40 个不同的表上运行。必须有一种方法可以在不编写 40 条不同命令的情况下执行此操作... 我在 SQL Server 中运行它。所有表都有不同的名称,我要操作
我习惯在 PHP 中使用命令“mysql_insert_id()”来返回插入到我的数据库中的最后一行的 id。 在 C# 中的 SQLite 中是否有等效的命令? 谢谢! -阿德娜 最佳答案 选择 l
试图找出一种方法来回填 ds 分区 Hive 表的分区。 我知道如何从 CLI 运行 Hive 命令,例如 $HIVE_HOME/bin/hive -e 'select a.col from tab1
我有 .bat 文件。看起来像下一个 ....many commands1 ftp -i -s:copy.txt ...many commands2 copy.txt 包含下一个命令 open ...
基本上我想输入 show 并检查是否有 show 命令或别名已定义并触发它,如果未定义则触发 git show 。 例如 rm 应该执行 rm 但 checkout 应该执行 git checkout
我公司的主数据库是 iSeries 机器,我已经非常习惯使用 DB2 命令和结构。我现在正在尝试做一个小项目,更新一个包含超过 300 万条记录的表。我想出一种比较和“清理”数据的更快方法是使用 My
我想在带有 Node 的终端中制作一个简单的按钮板,并“blessed”用于连接或运行不同的命令。 ----------------------------------------------- _
我们有一个 selenium IDE 脚本,正在转换为 python webdriver。以下命令未转换: [openWindow | http://mywebsite.com/index.php |
我正在学习这个关于从 GIT HUB 下载和安装 Web 文件的在线教程。我进入主题:启动我们的静态网站,系统提示我输入命令以下载和安装 Web 文件。但是,当我输入命令 yarn install 时
我在 shell 脚本中使用 elif 命令时遇到问题,就像在 fortran 中一样。 我有 100 家公司的员工名单。我想屏蔽那些员工少于 500 人的公司。我的脚本是 rm -f categor
我有一些 Linux 命令可以生成 token 。我在 Linux 机器上使用操作系统库形式的 Python 自动化了这些命令。它工作正常。 但是,当我在 Windows 中尝试相同的代码时,它没有返
本文分享自华为云社区《Git你有可能不知道交互式暂存》,作者:龙哥手记。 本节中的几个交互式 Git 命令可以帮助你将文件的特定部分组合成提交。 当你在修改了大量文件后,希望这些改动能拆分为若干提交而
我想知道如何使用 IN 比较语法来做到这一点。 当前的 SQL 查询是: select * from employee where (employeeName = 'AJAY' and month(e
我在这个位置安装了 Hadoop /usr/local/hadoop$ 现在我想列出 dfs 中的文件。我使用的命令是: hduser@ubuntu:/usr/local/hadoop$ bin/ha
是否有一个单一的 docker 命令可用于清除所有内容?如果正在运行,请停止所有容器、删除所有图像、删除所有卷...等。 最佳答案 我认为没有一个命令可以做到这一点。您首先需要停止所有容器使用 $ d
我基本上是在 clojure/nrepl 模式中寻找与 C-u C-x C-e 或 C-c C-p 等效的 Scheme。 我想要一个 C-x C-e 将输出打印到缓冲区,而不是仅仅在 repl 中。
我可以在 vim 中使用 pudb(一个 ncurses Python 调试器),因为,例如,:!python %在实际的终端窗口中运行。我更喜欢使用 gvim,但 gvim 运行 :!python
我正在尝试编写一个 FFMPEG 命令: 取为 输入 一个视频 input.mp4 和一个图像 pic.jpg 作为 输出 将 input.mp4 拆分为 20 秒的视频,按顺序重命名;对于每个分割视
我想转储视频每帧的比特率。我正在尝试使用 -vstats 获取此信息命令。当我运行此命令时 - ffmpeg -i input.mp4 -vstats 它显示至少应该定义一个文件。 如果有人能建议我任
我是一名优秀的程序员,十分优秀!